批处理脚本 - 跳过For循环中的errorlevel

时间:2016-04-27 16:58:59

标签: batch-file for-loop errorlevel

如果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 个答案:

答案 0 :(得分:2)

你应该试试这个:

@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逻辑

答案 1 :(得分:0)

带括号的goto :Label循环代码块中的

for会破坏块/循环上下文,因此标签上的代码就像在块/循环之外一样执行。因此,你需要解决这个问题。

Dennis van Gils指出了如何操作的方法 - 使用if / else逻辑(他的方法以及以下略微修改的代码段(应用数字比较)都需要{ {3}}):

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对(非)零,您还可以使用&&|| delayed expansion

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结构,你需要使用一个子程序,以便将这部分代码移到()块之外(你也没有需要operators这里):

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