我有一个包含四到五个文本文件的文件夹。
我的总体目标是:创建一个大文件,该文件具有单独文件的内容,但顺序正确。
我可以使用每个文件的时间戳,从最早的文件开始直到最小的文件。
我的流程现在看起来像这样:
在代码中,我这样做:
set temp_concat=%temp_dir%\temp_concat.log
echo %temp_concat%
echo aiu_logs > %temp_concat%
for /f "delims=" %%? in ('dir /b /o:d %Folder%*') do (
for /f "delims=" %%K in (%Folder%%%?) do (
echo %%K >>%temp_concat%
)
)
上面的代码似乎可以正常工作,因为我的代码temp_concat
很大。
但是,这花费的时间比预期的要长得多。我只需要等待大约40秒就可以合并三个文件。
有没有更好的方法来合并一定数量的文件,但是要按日期正确排列它们?
此批处理文件使用Sqashman发布的建议来使用FOR循环为命令COPY创建参数字符串,该命令COPY用于将文件内容按最早的修改的文件和最新的修改的文件最后的顺序连接到单个文件中。
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "Folder=%~dp0"
if not "%~1" == "" set "Folder=%~1"
set "Folder=%Folder:/=\%"
if not "%Folder:~-1%" == "\" set "Folder=%Folder%\"
set "ResultsFile=%Folder%Results.log"
del "%ResultsFile%" 2>nul
set "Arguments="
for /F "eol=| delims=" %%I in ('dir /A-D-H /B /O:D "%Folder%*" 2^>nul') do if not "%%~fI" == "%~f0" set "Arguments=!Arguments! + "%%I""
if defined Arguments (
echo aiu_logs>"%ResultsFile%"
copy /B "%ResultsFile%"%Arguments% "%ResultsFile%" >nul
)
endlocal
如果文件夹路径或文件名之一包含一个或多个感叹号,则!
由于启用了延迟的环境变量扩展,因此按批处理文件不起作用。
此外,命令行的长度受到限制,因此该批处理文件不适用于太多文件,必须根据每个文件的文件路径的长度和文件名的长度进行串联。
更好的解决方案是使用以下批处理文件:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "Folder=%~dp0"
if not "%~1" == "" set "Folder=%~1"
set "Folder=%Folder:/=\%"
pushd "%Folder%" 2>nul
if errorlevel 1 goto EndBatch
set "ResultsFile=Results.log"
del "%ResultsFile%" 2>nul
set "Arguments="
for /F "eol=| delims=" %%I in ('dir /A-D-H /B /O:D * 2^>nul') do if not "%%~fI" == "%~f0" call set "Arguments=%%Arguments%% + "%%I""
if defined Arguments (
echo aiu_logs>"%ResultsFile%"
copy /B "%ResultsFile%"%Arguments% "%ResultsFile%" >nul
)
popd
:EndBatch
endlocal
具有一个或多个感叹号的文件夹路径不再是问题。此外,!
由于此批处理文件未使用延迟扩展,因此文件名可能包含在内,这比第一个批处理文件慢一点。
该批处理文件将包含要连接文件的文件夹作为当前目录。因此,与第一个批处理文件相比,可以在COPY命令行上将更多文件名指定为自变量,因为指定的文件名没有路径。但是,可以与该批处理文件合并的文件内容的数量仍然受Windows命令行的最大长度或环境变量值的最大长度限制。
为了了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
call /?
copy /?
dir /?
echo /?
endlocal /?
for /?
goto /?
if /?
popd /?
pushd /?
set /?
setlocal /?
另请参阅有关使用命令重定向运算符的Microsoft文章,以获取有关>
和的说明2>nul
。Windows命令解释器在执行命令FOR之前,Windows命令解释器处理此命令行时,>
必须^
在FOR命令行上使用脱字符号将重定向运算符转义为原义字符,该命令在以和DIR命令在后台启动的单独命令进程中执行嵌入式命令行两者之间的连线作为进一步的论点。dir
%ComSpec% /c
'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句