批处理脚本 - 在For循环中根据ErrorLevel跳过

3
我试图让这个脚本在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
 )
2个回答

3
你应该尝试这个:
@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

你的代码有几个问题。首先,你启用了延迟扩展,但实际上并没有使用它,只有在!内的变量才会被延迟扩展。我还在文件路径周围加上引号,以保护它们免受带空格等字符的影响。最后,在for循环中,goto和标签是不起作用的,所以你需要用if else逻辑来替换它们。


非常好,非常感谢,这正是我需要的方式。您解释得非常清楚,我学到了新东西。 - arealhobo

0
在括号块内使用类似于for循环的goto :Label会打破块/循环上下文,因此标签处的代码将被执行,就好像它在块/循环之外一样。因此,您需要解决这个问题。

Dennis van Gils 指出了一种方法,可以使用 if/else 逻辑来实现(他的方法以及以下稍作修改的片段(应用数字比较)都需要 延迟扩展):

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

或者像这样,避免延迟扩展的必要性:

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 是否为(非)零,您还可以使用 &&|| 运算符

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结构,你需要使用子程序将代码的这部分移出()块(此处也不需要延迟扩展):
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接