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

4

最近我遇到了很多互联网连接中断问题。所以我想列出每次遇到问题的时间,并将其发送给我的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
)

再次感谢您的帮助!

非常感谢您的帮助!


如果您想测试这个Pinging Multiple PCs and Adding Text或者这个pastebin上的Multi Ping Tester with colors - Hackoo
你有一个拼写错误,if not %errolevel% 应该是 if not %errorlevel% - DavidPostill
@DavidPostill 感谢您的发现,我正在修改代码,这部分基本上已经被删除了 - 我用一个变量替换了它。 - Marcin
2个回答

11
打开命令提示符窗口,在该窗口中运行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。通常不使用负退出代码,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.

请查看以下内容:


2
尝试使用 IF NOT ERRORLEVEL 0 或者 IF NOT %ERRORLEVEL%==0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接