批处理脚本 - 在 For 循环中跳过错误级别

Batch Script - Skip on errorlevel in a For loop

如果对计算机的 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
 )

你应该试试这个:

@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 logic

goto :Label 在带括号的代码块内,如 for 循环打破了 block/loop 上下文,因此标签处的代码就像在 [=40 之外一样执行=].因此,您需要解决这个问题。


points out a way how to do it -- using if/else logic (his method as well as the following slightly modified snippet (applying numeric comparison) both require 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