为什么命令“if%errorlevel%1 do”会导致批处理文件处理退出?

时间:2016-09-11 11:28:51

标签: batch-file

我最近有很多网络连接停机时间。因此,我想列出每次遇到问题时将其发送给我的ISP。为了使它变得不那么乏味,我想,制作一种报告并将其作为日志文件发送会很好。我偶然发现了一些解决方案,但我发现的最好的是在这个网站上:Joost Kuin Ping with timestamp

我已经调整了一下这个代码,但我遇到了一个问题。如果我尝试使用if not %errorlevel% 0 do (...)if %errorlevel% 1 do (...)并尝试运行.bat文件,则Windows命令处理器窗口会弹出并消失。没有这个条件,批处理文件运行正常。但它没有做它的目的。我想制作2个文件,一个使用普通ping日志,另一个只有超时和目标主机无法访问时间戳。这是我第一次使用Windows脚本。我以前习惯用C ++编写代码。我没有获得host_ip,而是获得了与外部网络的第一次连接的IP地址。

@echo off

set host=host_ip 
set logfile=Ping_test.log
set logfile_fail=Ping_test_fail.log

echo Target Host = %host% >%logfile%
for /f "tokens=*" %%A in ('ping %host% -n 1') do (echo (%%A>>%logfile% && GOTO Ping)

:Ping
for /f "tokens=* skip=2" %%A in ('ping %host% -n 1 ') do (
    echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %%A>>%logfile%
    if not %errolevel% 0 do (echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% errorlvel %errorlevel% %%A>>%logfile_fail%) 
    echo %errorlevel% %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %%A
    timeout 1 >NUL 
    GOTO Ping
)

修改

感谢您提供有用的建议。我试图实现它们,并继续自己寻找解决方案。经过大量的时间和挫折之后,它就完成了。我必须根据for /F命令指令的执行方式(在另一个命令进程中)更改几行(包含在下面)。但最后我得到了我可以说的第一个实际有用的代码,并且说实话它让我意识到批处理脚本是多么有用。 ;)

:Ping
for /f "tokens=* skip=2" %%A in ('ping %host% -n 1 ^& call echo %%^^errorlevel%%^>error.level') do (
    set /p elv=<"error.level" 
    if not !elv!==0 (echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %%A>>%logfile_fail%)
    echo %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %%A>>%logfile%
    echo elv %elv% %date% %time:~0,2%:%time:~3,2%:%time:~6,2% %%A
    timeout 1 >NUL 
    GOTO Ping
)

再一次

非常感谢帮助我!

2 个答案:

答案 0 :(得分:6)

打开命令提示符窗口,在那里运行if /?help if并阅读输出帮助的所有页面以获取命令 IF

语法为:

if errorlevel 1 echo Previous command most likely exited with an error code.

这意味着如果先前命令或应用程序的退出代码大于或等于1,则输出上一个命令最有可能退出且错误代码大于0的消息。

if not errorlevel 1 echo Previous command most likely finished successfully.

这意味着如果先前命令或应用程序的退出代码低于1(不大于或等于1),则输出上一个命令最有可能成功完成的消息,退出代码为0.否则通常不使用否定退出代码。建议不要使用否定退出代码。

还可以通过使用立即扩展ERRORLEVEL或延迟扩展%ERRORLEVEL%来引用环境变量!ERRORLEVEL!的字符串值,从而需要延迟扩展而不是立即扩展errorlevel变量引用的大小写在命令块中。命令块是从左括号到匹配右括号的所有内容。

但是,不使用if errorlevel Xif not errorlevel X需要在环境变量引用和值之间使用==之类的运算符,例如

if %ERRORLEVEL% == 1 echo Exit code of previous command/application is 1.
if %ERRORLEVEL% == 0 echo Exit code of previous command/application is 0.

另请参阅Microsoft支持文章Testing for a Specific Error Level in Batch Files

看看:

答案 1 :(得分:2)

尝试IF NOT ERRORLEVEL 0IF NOT %ERRORLEVEL%==0