我希望向我一直在编写的批处理文件中添加一些功能; 本质上发生的事情是我使用 openvpn 拨号 VPN 连接,然后继续安装网络驱动器以及许多其他事情,我想做的是:
目前我一直在使用 20 秒的睡眠命令,该命令有效,但不是一种非常干净或智能的方法;我想我需要某种循环来尝试无限地 ping 主机,直到可以在批处理文件中继续之前到达它。任何帮助将不胜感激。
来自 stackoverflow 上的另一个线程...归功于 paxdiablo(在此处找到原始帖子)
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
:loop
set state=down
for /f "tokens=5,7" %%a in ('ping -n 1 !ipaddr!') do (
if "x%%a"=="xReceived" if "x%%b"=="x1," set state=up
)
echo.Link is !state!
ping -n 6 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
这将为您提供足够的弹药来使用和解决您的问题
ping
的输出取决于语言,因此依赖像
Received
这样的字符串不是一个好主意。首选且最可靠的方法是搜索字符串
TTL=
:
:loop
timeout 2
ping -n 1 %ipaddress% |find "TTL=" || goto :loop
echo Answer received.
||
的作用相当于“如果上一个命令 (
find
) 不成功,那么”(至于
timeout
:永远不要在没有空闲时间的情况下构建循环以减少CPU负载)
ERRORLEVEL
设置的
ping
是没有用的,因为在某些情况下,即使没有从远程主机收到任何有效回复,它也会将
ERRORLEVEL
设置为0(成功)!!! 但是,下面描述的方法是可移植的并且适用于:
@echo off
FOR /F %%A IN ('ping %1 -n 1 ^| findstr /C:^= ^| find /c /v ""') DO (SET "res=%%A")
if %res% GEQ 3 (
echo SUCCESS.
) else (
echo FAILURE.
)
如果将上面的代码保存到名为例如pingtest.bat
,你可以这样使用它:
pingtest 192.168.1.1
此方法利用了字符串中存在的等号 bytes=
,这些等号不受翻译为其他语言的影响,并且不会出现在不成功的 ping/echo 结果中。此外,将开关
-n 1
修改为例如
-n 6
允许您在变量
%res%
中获得反映连接质量的定性结果。使用下面的代码,您可以标准化变量
%res%
中的结果,使其在失败时变为
0
...以及在成功时 - 成功 ping 的数量:
@echo off
FOR /F %%A IN ('ping %1 -n 6 ^| findstr /C:^= ^| find /c /v ""') DO (SET "res=%%A")
if %res% GEQ 3 (
SET /A "res=%res%-2"
) else (
SET "res=0"
)
ECHO The number of successful pings is %res%
要暂停程序,只需像这样循环调用它:
@echo off
:loop
FOR /F %%A IN ('ping %1 -n 1 ^| findstr /C:^= ^| find /c /v ""') DO (SET "res=%%A")
if %res% LSS 3 goto :loop