2017-10-05 118 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