批量ERRORLEVEL ping响应

Las*_*007 10 windows ping batch-file command-prompt

我正在尝试使用批处理文件来确认使用ping的网络连接.我想批量运行然后打印如果ping成功与否.问题是,它作为批处理运行时始终显示"失败".这是代码:

@echo off
cls
ping racer | find "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),"
if not errorlevel 1 set error=success
if errorlevel 1 set error=failure
cls
echo Result: %error%
pause
Run Code Online (Sandbox Code Playgroud)

'racer'是我电脑的名字.我正在让我的计算机ping自己,所以我可以消除连接不良的变量.正如我之前所说,批次总是导致失败.奇怪的是,如果我将代码复制到命令提示符中,程序运行正常.有谁知道为什么程序在命令提示符下工作正常但不能作为批处理工作?谢谢

Jel*_*rts 22

更可靠的ping错误检查方法:

@echo off
set "host=192.168.1.1"

ping -n 1 "%host%" | findstr /r /c:"[0-9] *ms"

if %errorlevel% == 0 (
    echo Success.
) else (
    echo FAILURE.
)
Run Code Online (Sandbox Code Playgroud)

这通过检查诸如69 ms314ms是否打印的字符串来工作ping.

(Windows的翻译版本可能会打印42 ms(带空格),因此我们会检查它.)

原因:

其他提议,例如匹配time=TTL不可靠,因为ping地址不显示TTL(至少不在我的Windows 7计算机上),Windows的翻译版本可能会显示该字符串的翻译版本time=.此外,不仅可以time=翻译,而且有时可能是翻译,time<而不是time=如此time<1ms.

  • `ms`也被翻译成其他语言(例如俄语). (2认同)

Jon*_*Jon 2

我不太确定FIND设置错误级别之间的交互是什么,但您可以很容易地做到这一点:

@echo off
for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i
echo %MATCHES%
Run Code Online (Sandbox Code Playgroud)

0如果 ping 失败1或成功,则会打印此信息。我让它只寻找“0% 损失”(不是特别是 4 个 ping),以便可以自定义 ping 数量。

百分号已加倍,这样就不会被误认为是应该替换的变量。

这个FOR技巧只是将命令的输出设置为环境变量的值。

  • 它可能不起作用。例如,当收到“主机无法访问”之类的响应时,我损失了 %0 (3认同)