暂停批处理文件,直到主机可以访问(使用ping)?

时间:2013-02-01 00:48:08

标签: loops batch-file ping host openvpn

我希望为我一直在写的批处理文件添加一些功能; 基本上发生的事情是我使用openvpn拨打VPN连接,然后继续安装网络驱动器以及许多其他东西,我想要做的是:

  • 通过OpenVPN拨打连接(我工作正常)
  • 在VPN的另一端ping主机,并且在可以访问此主机之前不要继续通过批处理文件。

目前我一直在使用20秒的睡眠命令,但它不是一种非常干净或智能的方式。我想我需要某种循环来尝试无限地ping主机,直到它在继续批处理文件之前可以访问。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:8)

来自stackoverflow上的另一个线程...信用卡支付暗黑破坏神(找到原始帖子here

@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

这将为您提供足够的弹药来解决您的问题

答案 1 :(得分:2)

如前所述,ping的输出依赖于语言,因此依赖Received之类的字符串并不是一个好主意。首选且最可靠的方法是搜索字符串TTL=

:loop
timeout 2
ping -n 1 %ipaddress% |find "TTL=" || goto :loop
echo Answer received.

||作为“如果上一个命令(find)未成功,那么”

(对于timeout:永远不构建一个没有空闲时间来减少CPU负载的循环)

答案 2 :(得分:0)

如果您翻译"已收到"使用您的语言用于单词Received的字符串(即意大利语为Ricevuti)。