【问题标题】:Batch Script - Skip on errorlevel in a For loop批处理脚本 - 在 For 循环中跳过错误级别
【发布时间】:2016-04-27 16:58:59
【问题描述】:

如果对计算机的 ping 错误级别不等于 0,我正在尝试让此脚本进入下一部分,但我无法使其工作。输出显示语法不正确。谢谢。

@echo
setlocal EnableDelayedExpansion

for /f %%a in (main.txt)  do ( 
ping -n 1 %%a > NUL
IF %ERRORLEVEL%==0 (GOTO :COPY) ELSE GOTO :SKIP

:COPY
ROBOCOPY C:\Blah C:\Bloh
ECHO FILE COPIED

:SKIP
 ECHO FILE NOT COPIED
 )

【问题讨论】:

    标签: batch-file for-loop errorlevel


    【解决方案1】:

    你应该试试这个:

    @echo
    setlocal EnableDelayedExpansion
    
    for /f %%a in (main.txt) do ( 
      ping -n 1 %%a >NUL
      IF "!ERRORLEVEL!"=="0" (
        ROBOCOPY "C:\Blah" "C:\Bloh"
        ECHO FILE COPIED
      ) ELSE (
        ECHO FILE NOT COPIED
      )
    )
    PAUSE
    

    您的代码存在一些问题。首先,您启用延迟扩展,但实际上并没有使用它,只有 ! 中的变量会延迟扩展。我还在你的文件路径周围加上引号,以保护它们免受带有空格和东西的路径的影响。最后,goto 和标签在 for 循环中不起作用,因此您需要将它们替换为 if else 逻辑

    【讨论】:

    • 太好了,非常感谢,这符合我的需要。你解释得很好,我学到了一些新东西。
    【解决方案2】:

    goto :Label 在像for 循环这样的带括号的代码块内会破坏块/循环上下文,因此标签处的代码就像在块/循环之外一样执行。因此,您需要解决这个问题。


    Dennis van Gils 指出了一种方法——使用if/else 逻辑(他的方法以及以下稍微修改的sn-p(应用数字比较)都需要delayed expansion):

    setlocal EnableDelayedExpansion
    for "usebackq" /F %%A in ("main.txt") do (
        > nul ping -n 1 %%A
        if !ErrorLevel! EQU 0 (
            robocopy "C:\Blah" "C:\Bloh"
            echo FILE COPIED
        ) else (
            echo FILE NOT COPIED
        )
    )
    endlocal
    

    或者这样,避免delayed expansion的必要性:

    for "usebackq" /F %%A in ("main.txt") do (
        > nul ping -n 1 %%A
        if ErrorLevel 1 (
            echo FILE NOT COPIED
        ) else (
            robocopy "C:\Blah" "C:\Bloh"
            echo FILE COPIED
        )
    )
    

    要检查ErrorLevel 与(非)零,您还可以使用&&|| operators

    for "usebackq" /F %%A in ("main.txt") do (
        > nul ping -n 1 %%A || (
            echo FILE NOT COPIED
        ) && (
            robocopy "C:\Blah" "C:\Bloh"
            echo FILE COPIED
        )
    )
    

    最后,如果您确实想保留goto :Label 结构,则需要使用子例程将这部分代码移到() 块之外(您也不需要delayed expansion这里):

    for "usebackq" /F %%A in ("main.txt") do (
        > nul ping -n 1 %%A
        call :SUB "C:\Blah" "C:\Bloh"
    )
    exit /B
    
    :SUB
    if %ErrorLevel% NEQ 0 goto :SKIP
    robocopy "%~1" "%~2"
    echo FILE COPIED
    :SKIP
    goto :EOF
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2016-03-01
      • 2023-03-16
      • 2023-03-06
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      相关资源
      最近更新 更多