for循环使用if else批处理

时间:2017-10-05 14:05:17

标签: batch-file

我正在创建一个用于从文件夹创建zip文件的批处理,我想检查zip文件是否已成功创建。它记录了已经创建了哪个zip文件但是当它出错时应该转到标签并停止操作。这不起作用,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

2 个答案:

答案 0 :(得分: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
    )
)

答案 1 :(得分: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那么......
Microsoft支持文章Testing for a Specific Error Level in Batch Files中解释了这一点,并在批处理文件和命令行中从MS-DOS到Windows 10工作。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

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

另请阅读以下答案: