这是我的批处理文件,用于解析目录和某些类型的zip文件
REM Begin ------------------------
tasklist /FI "IMAGENAME eq 7za.exe" /FO CSV > search.log
FOR /F %%A IN (search.log) DO IF %%~zA EQU 0 GOTO end
for /f "delims=" %%A in ('dir C:\Temp\*.ps /b') do (
"C:\Program Files\7-Zip\cmdline\7za.exe" a -tzip -mx9 "C:\temp\Zip\%%A.zip" "C:\temp\%%A"
Move "C:\temp\%%A" "C:\Temp\Archive"
)
:end
del search.log
REM pause
exit
REM End ---------------------------
此代码适用于我90%的需求。它将作为计划任务部署。
但是,实时情况下* .ps文件相当大(最小1GB)。所以代码应该检查传入的文件是否完全写入并且没有被写入的应用程序锁定。
我在别处看到另一个例子,建议采用以下方法
:TestFile
ren c:\file.txt c:\file.txt
if errorlevel 0 goto docopy
sleep 5
goto TestFile
:docopy
但是这个例子适用于固定文件。如何在for循环中使用那么多标签和GoTo而不会导致无限循环?或者这个代码在For循环中使用是否安全?
感谢您的帮助。
答案 0 :(得分:1)
我同意GOTO循环存在风险 - 错误会使其永远循环,这对于计划任务来说根本不好。
对于像这样的任务,我倾向于使用Resource Kit tool called Robocopy,部分原因是因为它很快,但也因为它很强大。如果文件没有准备好( /r:3
),我通常将其设置为执行3-5次重试(选项/w:10
),暂停10秒,然后记录任何错误,以便我可以查看它们( /log:...
)。非常便利。这是the full list of options,它可以帮助您准确选择需要复制的内容。
我的第一反应可能有些仓促。小重命名技巧可以集成到你的脚本中,可能会正常工作:
...
for /f "delims=" %%A in ('dir C:\Temp\*.ps /b') do (
:TestFile
ren C:\Temp\%%A.ps C:\Temp\%%A.ps
if errorlevel 0 goto Continue
sleep 5
goto TestFile
:Continue
"C:\Program Files\7-Zip\cmdline\7za.exe" a -tzip -mx9 "C:\temp\Zip\%%A.zip" "C:\temp\%%A"
move "C:\temp\%%A" "C:\Temp\Archive"
)
...
或者,如果你想使用Robocopy,你可以先移动文件然后再进行压缩。 (只要你在同一个分区上移动文件 - 在你的例子中它是从C:\ TEMP到C:\ TEMP \ Archived - 没有滞后。)这样Robocopy会等到文件是准备好了,然后让你的脚本继续压缩。这是一个例子:
...
for /f "delims=" %%A in ('dir C:\Temp\*.ps /b') do (
robocopy C:\Temp C:\Temp\Archive\ %%A.ps /mov /r:100 /w:5 /log+:copylog.txt
"C:\Program Files\7-Zip\cmdline\7za.exe" a -tzip -mx9 "C:\temp\Archive\%%A.zip" "C:\temp\Archive\%%A.ps"
)
...
答案 1 :(得分:0)
以下是我最终使用的批处理文件脚本。它的要求非常好。我希望它可以帮助那些与我有相同要求的人。
tasklist /FI "IMAGENAME eq 7za.exe" /FO CSV > search.log
FOR /F %%%A IN (search.log) DO IF %%%~zA EQU 0 GOTO end
for /f "delims=" %%A in ('dir C:\Temp\ZIP\*.txt /b') do (
:TestFile
"C:\Program Files\7-Zip\cmdline\7za.exe" a -tzip -mx9 "C:\temp\Zip\ZipDone%%A.zip" "C:\temp\zip\%%A"
Move "C:\temp\ZIP\%%A" "C:\Temp\ZIP\Archive"
)
:end
del search.log
REM pause
Exit