首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在批处理中使用if else循环

在批处理中使用if else循环
EN

Stack Overflow用户
提问于 2017-10-05 14:05:16
回答 2查看 4.4K关注 0票数 1

我正在创建一个从文件夹创建zip文件的批处理,我想检查压缩文件是否已经成功创建。它记录了创建了哪个zip文件,但是当它出错时,它应该转到一个标签上并停止操作。这是不起作用的,否则命令将被回显而不执行。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-07 09:48:50

以下是重写和扩展的批处理代码。如果无法将子文件夹压缩到ZIP存档,批处理文件不会立即停止。

代码语言:javascript
复制
@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,那么.

微软支持文章测试批处理文件中的特定错误级别解释了这一点,并在批处理文件和命令行中从Windows到Windows 10工作。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并非常仔细地读取为每个命令显示的所有帮助页。

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

还请阅读以下内容的答复:

票数 0
EN

Stack Overflow用户

发布于 2017-10-05 22:50:23

我认为这是因为您的ELSE包含两个没有分开的语句,因此goto最终成为set命令的一部分。为了解决这个问题,为了提高可读性,我认为您应该稍微修改一下格式:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46587699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档