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