检查是否仍在使用Windows批处理脚本编写目录中的文件(Check if files in a d

2019-10-20 18:35发布

下面是我的批处理文件来分析一个目录,某些类型的压缩文件

 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

但是这个例子是很好的一个固定的文件。 我如何可以使用多个标签和GOTO的内部for循环,而不会导致一个无限循环? 或者是这个代码的安全在for循环使用?

感谢您的任何帮助。

Answer 1:

我同意GOTO循环是有风险的-一个错误将使它永远循环下去,这是不好的,在所有的计划任务。

对于这样的任务,我倾向于使用所谓的Robocopy资源工具包工具 ,部分是因为它的速度快,而且还因为它的强大。 我通常把它做3-5重试(选项/r:3 ),与该文件还没有准备好(10秒的暂停/w:10 ),然后把它记录任何错误,所以我可以查看他们( /log:... )。 非常便利。 下面是完整的选项列表 ,它可以帮助你选择你需要复制什么。

我可能已经有点仓促与我的第一个反应。 小窍门重命名,可以集成到你的脚本,并可能会好起来的工作:

...
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 \存档 - 有没有滞后性。)这样的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"
)
...


Answer 2:

下面是我最终使用的批处理文件脚本。 它工作得很好的需求。 我希望它可以帮助别人与矿山同样的要求。

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


文章来源: Check if files in a directory are still being written using Windows Batch Script