检查是否仍在使用Windows批处理脚本
这里是我的批处理文件来解析目录编写目录中的文件,以及某些类型的压缩文件检查是否仍在使用Windows批处理脚本
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循环?
谢谢你的帮助。
以下是我最终使用的批处理文件脚本。它的要求非常好。我希望它可以帮助那些与我的要求相同的人。
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
我同意GOTO循环是有风险的 - 一个错误会使它永远循环,这对于计划任务来说并不好。
对于这样的任务,我倾向于使用
Resource Kit tool called Robocopy,部分是因为它速度快,但也因为它很健壮。如果文件尚未准备好(
/w:10
),我通常会将其设置为做3-5次重试(选项
/r:3
),并暂停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"
)
...
上面的ren命令将ErrorLevel返回为0,即使尝试重命名失败。我们如何真正确定重命名失败? – FMFF 2010-04-07 13:57:37
我的测试显示ErrorLevel设置为1的失败重命名,就像失败的复制,移动等 而且robocopy选项仍然可以使用。 :) – ewall 2010-04-07 14:10:12