Windows命令行 - 根据Ping延迟选择服务器

时间:2017-06-07 15:46:51

标签: windows batch-file command-line ping

Ok基本前提是有两个服务器具有相同的文件。

我正在使用Windows命令行脚本并向这些主机中的任何一个打开网络共享。我想让脚本“智能”,这样可以解决两台服务器之间的延迟问题,并选择要连接的最低延迟主机。

我想做类似的事情(我知道这段代码不起作用,这是我的概念的一个例子):

PING 192.168.0.1
SET HOST1=%ERRORLEVEL%
PING 192.168.0.2
SET HOST2=%ERRORLEVEL%
IF HOST1 GTR HOST2 GOTO HOST2CONNECT
:HOST1CONNECT
NET USE X: \\HOST1 (etc)
:HOST2CONNECT
NET USE X: \\HOST2 (etc)

这有什么意义吗?我似乎无法想象一种比较来自两个PING测试的数据的方法,我知道在这种情况下ERRORLEVEL只是一个1或0,基于ping是否成功,所以它是垃圾,因为它们会都成功了。但我希望你能得到这个概念,并能看到我所缺少的东西。

提前致谢。

2 个答案:

答案 0 :(得分:1)

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem Initialize variables
    set "selected="
    set "min=99999999"
    set serverList= "bing.com" "duckduckgo.com" "google.es" "google.com"

    echo - Testing -----------------------------

    rem Enumerate the hosts to check
    for %%a in ( %serverList% ) do (

        rem Ping the host and retrieve the average roundtrip
        for /f "tokens=6 delims== " %%r in ('
            ping -n 1 "%%~a" ^| findstr /r /c:"^  .*ms$"
        ') do for /f "delims=ms" %%t in ("%%r") do (
            echo "%%~a" : %%t ms

            rem Determine if the current host has a lower rtt
            rem if %%t geq min or min is already 0, then we have
            rem a division by 0, else a lower rtt has been found
            set /a "1/(min/(%%t+1))" && (
                set "selected=%%~a"
                set "min=%%t"
            )
            rem Of course this can be done with delayed expansion, 
            rem just a question of personal preferences
        )
    ) 2>nul 

    echo(
    echo - Selected ----------------------------
    echo %selected% : %min%

答案 1 :(得分:1)

在我这样做之前,MC ND发布了他的答案他应该获得学分。请不要将此标记为答案,这不是我发布的意图。

因为我已经努力发布了答案,并且为了完整起见,我觉得发布另一种处理问题的方法并没有什么坏处。主要区别在于我选择使用ping命令的平均往返时间,并提供一种方法来将延迟时间和目标主机名存储在一组可被视为结构数组。

请记住,使用ping命令测量往返延迟并不十分准确,结果可能会发生巨大波动。请参阅Wikipedia中的以下引文:

  

许多软件平台都提供可以使用的称为ping的服务   测量往返延迟。 Ping不执行数据包处理;它   仅在收到数据包时发回响应(即执行   这是一种测量延迟的第一种粗略方法。平   无法执行准确的测量,主要是因为它使用了   ICMP协议仅用于诊断或控制目的,   并且不同于诸如TCP之类的真实通信协议。   此外,路由器和ISP可能会应用不同的流量整形   不同协议的政策。

@echo off

setlocal enabledelayedexpansion
set targets="192.168.0.1" "192.168.0.2"

for %%e in (%targets%) do (
  call :GetAverageLatency %%e latency

  if errorlevel 1 (
    echo Unable to obtain latency from host: %%~e
    exit /b
  )

  set /a count+=1
  set "host[!count!].name=%%~e"
  set "host[!count!].latency=!latency!"

  if -!latency! gtr -!lowest! (
    set lowest=!latency!
    set index=!count!
  )
)

echo;Mapping network drive to host: !host[%index%].name!
echo;

net use * "\\!host[%index%].name!"
set host

exit /b

:GetAverageLatency (__in hostName, __out *latency) {
  for /f "skip=10 tokens=13 delims=m " %%e in ('ping "%~1"') do (
    set "%2=%%e"
    exit /b 0
  )
  exit /b 1
}

set host命令显然不是必需的,但它用于显示存储在host*变量中的值。