我正在寻找向我一直在编写的批处理文件添加一些功能;基本上发生的事情是我使用 openvpn 拨打 VPN 连接,然后继续安装网络驱动器以及许多其他事情,我想做的是:
- 通过 OpenVPN 拨打连接(我工作正常)
- ping VPN 另一端的主机,在可以访问该主机之前不要继续处理批处理文件。
目前我一直在使用 20 秒的睡眠命令,它有效,但不是一种非常干净或智能的方式;我想我需要某种循环来尝试无限地ping主机,直到它可以访问,然后再继续批处理文件。任何帮助将不胜感激。
我正在寻找向我一直在编写的批处理文件添加一些功能;基本上发生的事情是我使用 openvpn 拨打 VPN 连接,然后继续安装网络驱动器以及许多其他事情,我想做的是:
目前我一直在使用 20 秒的睡眠命令,它有效,但不是一种非常干净或智能的方式;我想我需要某种循环来尝试无限地ping主机,直到它可以访问,然后再继续批处理文件。任何帮助将不胜感激。
来自stackoverflow上的antoher线程......归功于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 负载)
如果您使用您的语言用于单词 Received 的字符串翻译“Received”字符串,它会起作用(即意大利语是 Ricevuti)。