批处理脚本 - 在 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
如果对计算机的 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 之外一样执行=].因此,您需要解决这个问题。
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