检查是否仍在使用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" 
) 
... 
+0

上面的ren命令将ErrorLevel返回为0,即使尝试重命名失败。我们如何真正确定重命名失败? – FMFF 2010-04-07 13:57:37

+0

我的测试显示ErrorLevel设置为1的失败重命名,就像失败的复制,移动等 而且robocopy选项仍然可以使用。 :) – ewall 2010-04-07 14:10:12