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

问题描述 投票:0回答:4

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

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

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

loops batch-file ping host openvpn
4个回答
9
投票

来自 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

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


4
投票
正如多年前已经提到的,

ping

的输出取决于语言,因此依赖像
Received
这样的字符串不是一个好主意。首选且最可靠的方法是搜索字符串 
TTL=
:

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

||

 的作用相当于“如果上一个命令 (
find
) 不成功,那么”

(至于

timeout

:永远不要在没有空闲时间的情况下构建循环以减少CPU负载)


0
投票
如果您使用您的语言中用于“Received”一词的字符串翻译“Received”字符串,则该字符串有效(即意大利语中为 Ricevuti)。


0
投票
测试由

ERRORLEVEL

 设置的 
ping
 是没有用的,因为在某些情况下,即使没有从远程主机收到任何有效回复,它也会将 
ERRORLEVEL
 设置为 
0(成功)!!!

但是,下面描述的方法是可移植的并且适用于:

    翻译成所有其他语言,例如:“ms”、“TTL”、“回复”、“丢失”、“无法到达”、“已收到”等...,包括俄语和中文。
  1. Ping IPv4 地址。
  2. Ping IPv6 地址。
  3. 发生错误
  4. “一般故障”的情况。
  5. Ping 一个地址,返回
  6. “请求超时。”
  7. Ping 地址时返回
  8. “目标主机无法访问。”
  9. Ping 可解析的字母数字主机。
  10. Ping 无法解析的字母数字主机,这会导致返回
  11. “Ping 请求无法找到主机 UnresolvableHost...” 错误。
@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
    
© www.soinside.com 2019 - 2024. All rights reserved.