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

Mar*_*cin 2 batch-file

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

我已经调整了一下这个代码,但我遇到了一个问题.如果我尝试使用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
)
Run Code Online (Sandbox Code Playgroud)

编辑:

感谢您提供有用的建议.我试图实现它们,并继续自己寻找解决方案.经过大量的时间和挫折之后,它就完成了.我必须根据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
)
Run Code Online (Sandbox Code Playgroud)

再一次

非常感谢帮助我!

Mof*_*ofi 6

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

语法是:

if errorlevel 1 echo Previous command most likely exited with an error code.
Run Code Online (Sandbox Code Playgroud)

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

if not errorlevel 1 echo Previous command most likely finished successfully.
Run Code Online (Sandbox Code Playgroud)

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

也可以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.
Run Code Online (Sandbox Code Playgroud)

另请参阅Microsoft支持文章测试批处理文件中的特定错误级别.

并看看: