2010-03-29 92 views
0

這裏是我的批處理文件來解析目錄編寫目錄中的文件,以及某些類型的壓縮文件檢查是否仍在使用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循環?

謝謝你的幫助。

回答

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 
1

我同意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