2017-10-05 116 views
1

我正在創建一個用於從文件夾創建zip文件的批處理,我想檢查zip文件是否已經成功創建。它記錄了哪個zip文件已經被創建,但是當它出錯時它應該得到一個標籤並停止操作。這不起作用,ELSE命令被回顯並且不被執行。for循環if if else else批號

SETLOCAL EnableExtensions EnableDelayedExpansion 

for /d %%d in (*) do (
    "7z.exe" a -r -tzip "%%d.zip" ".\%%d\" & IF %ERRORLEVEL% EQU 0 (echo Archive "%%d.zip" created succesfully >> "Archive-log %date%.txt") ELSE (set fault="%%d.zip" goto createzip)) 

exit /b 

:createzip 
echo Failed creating archive %fault% >> "Error-log %date%.txt" 
exit /b 
+1

你可以格式化你的代碼?現在閱讀非常困難 – Michael

+0

@Dave,我已經爲了讀者的利益而格式化了代碼! – Compo

+2

我會用條件執行來做到這一點。使用'&&'成功,'||'失敗。 – Squashman

回答

0

這是重寫和擴展的批處理代碼。批處理文件不會在無法將子文件夾壓縮到ZIP壓縮文件時立即停止。

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 
rem Get current date in region dependent format with . as delimiter. 
set "FileDate=%DATE:/=.%" 
set "ErrorCount=0" 
set "FolderCount=0" 

rem Compress each non hidden subfolder in current folder into a ZIP file. 
for /D %%I in (*) do (
    set /A FolderCount+=1 
    "7z.exe" a -r -tzip "%%I.zip" ".\%%I\" 
    if errorlevel 1 (
     echo Failed creating archive: "%%I.zip">>"Error-log %FileDate%.txt" 
     set /A ErrorCount+=1 
    ) else (
     echo Archive "%%I.zip" created succesfully.>>"Archive-log %FileDate%.txt" 
    ) 
) 

rem Exit batch processing if no subfolder was found in current folder? 
if %FolderCount% == 0 endlocal & exit /B 

set "ErrorPluralS=s" 
if %ErrorCount% == 1 set "ErrorPluralS=" 
set "FolderPluralS=s" 
if %FolderCount% == 1 set "FolderPluralS=" 
echo Processed %FolderCount% folder%FolderPluralS% with %ErrorCount% error%ErrorPluralS%.>>"Archive-log %FileDate%.txt" 
endlocal 

if errorlevel 1也沒有工作延遲擴展的使用率就是:
如果先前的命令或可執行的退出代碼爲大於或等於1 THEN ...
這是在Microsoft支持文章解釋Testing for a Specific Error Level in Batch Files並在批處理文件和命令行上從MS-DOS工作到Windows 10。

爲了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀爲每個命令顯示的所有幫助頁面。

  • echo /?
  • endlocal /?
  • for /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?

還閱讀了答案:

+0

嗨莫菲謝謝你的幫助 – Dave

0

我認爲這是因爲你的ELSE包含2個不分開的語句,所以goto最終成爲set命令的一部分。爲了解決這個問題,爲了便於閱讀,我認爲你應該重新格式化一下:

for /d %%d in (*) do (
    "7z.exe" a -r -tzip "%%d.zip" ".\%%d\" 
    IF %ERRORLEVEL% EQU 0 (
     echo Archive "%%d.zip" created succesfully >> "Archive-log %date%.txt" 
    ) ELSE (
     set fault="%%d.zip" 
     goto createzip 
    ) 
) 
+0

'%ERRORLEVEL%'在'for'循環的括號內沒有變化,因爲它在解析時間內被評估!你需要延遲擴展,即'!ERRORLEVEL!',要麼在子程序中執行'for'循環體,即'call:label',要麼應用'如果錯誤級別號(命令)else(other_commands)'。請注意,如果最後一次程序運行返回等於或大於指定數量的退出代碼**,則「如果錯誤級別編號」指定了真實條件。 – JosefZ