使用 findstr 获取丢包的更好方法,批量

Better way to use findstr to get packet loss, batch

希望使用 findstr 在 ping 命令后找到“0% 损失”。 也许是一系列高达“50% 损失”的东西。

这是为了检查并确保在启动在线内容之前 100% 建立互联网连接。

目前结构化:

ping %ip% -n 3 -w 3000 | findstr "0% loss"
pause
goto Starting

它目前正在忽略 findstr 并且无论如何它都拒绝找到我正在寻找的东西

理想情况下它会像这样流动:

ping %ip% -n 3 -w 3000 | findstr "0% loss" || goto Echo
pause
goto Starting
:echo
Could not find "0% loss"
pause

我试过了,它会回显,但即使是 100% 的连接,所以它显然没有按照我想要的方式运行。

是否有更好的方法来查找丢包率?

如果设备完全离线时 ping 不起作用,是否有更好的方法来测试互联网连接。

您要查找的搜索字符串太宽泛。当您检查 findstr 是否有“0% 损失”时,您也会无意中获得“100% 损失”。幸运的是,ping 将丢包放在括号中,因此您可以简单地将左括号包含在搜索字符串中。

@echo off
title Restart
color 0A
cls

:start
Cls
set ip=www.google.com

:Pingcheck
echo Checking ping..
timeout /t 3
ping %ip% -n 5 -w 3000 | findstr /C:"(0% loss" || goto Loss
pause

:NoLoss
echo We found 0 packet loss, at %ip% on %date% at %time%
pause
goto start

:Loss
echo We found some packet loss.
pause

我还更改了 :Echo 标签的名称,因为 echo 已经是一个命令,将它也作为标签会造成混淆。

您还可以使用 wmi 检查 ping 状态。此方法的优点是它会在第一次失败时 goto :fail,并且不会继续完成 5 次 ping 尝试的失败原因,同时还提供了一种保持平均响应时间的简单方法。它使用 set /a 检查 wmi 查询的结果是否包含数值。如果是,则通过。如果不是,则失败。

@echo off & setlocal

set "host=www.google.com"

echo Pinging %host%...

for /L %%I in (1,1,5) do (
    for /f "delims=" %%x in (
        'wmic path win32_pingstatus where "address='%host%' and timeout=3000"^
        get ResponseTime /value ^| find "="'
    ) do (
        2>NUL set /a "%%x, avg += ResponseTime" || goto fail
    )
)

set /a "avg /= 5"
echo 0%% packet loss.  Woo.  Average response time was %avg%ms.
exit /b

:fail
echo Aw snap.  Packet loss.