通过服务器排序并确定最快 ping 的简化方式
Posted
技术标签:
【中文标题】通过服务器排序并确定最快 ping 的简化方式【英文标题】:Streamlined way to sort thru servers and determine the fastest ping 【发布时间】:2019-05-14 02:16:24 【问题描述】:我正在尝试从网络上的许多服务器中确定最快的 ping 速率。服务器的数量可能多达几十个。我确实有如下所示的脚本,目前将通过一些排序并且效果很好,但我正在寻找一种更优雅的方式来做到这一点。服务器列表也可以存储在文本文件中。实际上,服务器名称的文本文件可能更容易维护,因为它们可能会随着时间而改变。
编辑:如果服务器离线,此脚本也无法处理,因此我可能会意外地将离线服务器列为最快 ping。
SET SERVER_A=MEDUBNA2
SET SERVER_B=HANSECAD2
SET SERVER_C=MEINWESSFS01
SET SERVER_D=MEAUHWC01
for /f "tokens=2 delims==," %%a in ('ping %SERVER_A% -n 1 -w 1000') do SET MINSERVER_A=%%a
for /f "tokens=2 delims==," %%b in ('ping %SERVER_B% -n 1 -w 1000') do SET MINSERVER_B=%%b
for /f "tokens=2 delims==," %%c in ('ping %SERVER_C% -n 1 -w 1000') do SET MINSERVER_C=%%c
for /f "tokens=2 delims==," %%d in ('ping %SERVER_D% -n 1 -w 1000') do SET MINSERVER_D=%%d
SET MINSERVER_A=%MINSERVER_A:~0,-2%
SET MINSERVER_B=%MINSERVER_B:~0,-2%
SET MINSERVER_C=%MINSERVER_C:~0,-2%
SET MINSERVER_D=%MINSERVER_D:~0,-2%
if %MINSERVER_A% lss %MINSERVER_B% (
SET FASTESTSERVERGROUP1=%SERVER_A%
) else (
SET FASTESTSERVERGROUP1=%SERVER_B%
)
if %MINSERVER_C% lss %MINSERVER_D% (
SET FASTESTSERVERGROUP2=%SERVER_C%
) else (
SET FASTESTSERVERGROUP2=%SERVER_D%
)
if %FASTESTSERVERGROUP1% lss %FASTESTSERVERGROUP2% (
SET FASTESTSERVEROVERALL=%FASTESTSERVERGROUP1%
) else (
SET FASTESTSERVEROVERALL=%FASTESTSERVERGROUP2%
)
echo %SERVER_A%: %MINSERVER_A%
echo %SERVER_B%: %MINSERVER_B%
echo %SERVER_C%: %MINSERVER_C%
echo %SERVER_D%: %MINSERVER_D%
echo Fastest Server Group 1: %FASTESTSERVERGROUP1%
echo Fastest Server Group 2: %FASTESTSERVERGROUP2%
:: Ultimate goal is to determine the fastest server out of the list.
echo Fastest Server Overall: %FASTESTSERVEROVERALL%
【问题讨论】:
您可以使用FOR /F
命令读取包含服务器名称列表的文件。
我不明白为什么前两个服务器包含第 1 组,接下来的两个第 2 组。如果目标是确定最快的服务器,那么组无关紧要。否则,请解释放置在文本文件中的服务器必须如何分组......也许是两个两个?
服务器不需要分组。我只是将它们分组以实现更简洁的消除过程,因为我不想将 if 语句嵌套在 if 语句中,因为我不知道这样做的更简洁方法。我这样做的方式很像篮球比赛中的括号。
【参考方案1】:
您需要做的就是创建几个嵌套的FOR
命令来读取服务器列表。然后ping服务器。处理输出,使其只有数字。然后将该数字与当前最快的数字进行比较。
@echo off
setlocal enabledelayedexpansion
set "ms=10000"
set "fastest="
REM Read the server list
FOR /F "delims=" %%G IN (serverlist.txt) DO (
REM read the ping results
for /f "tokens=2 delims==," %%H in ('ping %%G -n 1 -w 1000 ^|find /i "minimum"') do (
REM Manipulate the ping result so that it is only a number
for /f "delims=m " %%I in ("%%H") do (
REM Compare the ping result to the current fastest time.
IF %%I LSS !ms! (
set "fastest=%%G"
set "ms=%%I"
)
)
)
)
echo Fastest Server is: %fastest%
pause
【讨论】:
我非常感谢您在这里所做的一切。我在这里担心 ping 命令和将运行此脚本的用户机器的语言。知道这个脚本将在全球范围内运行,有没有办法让它不依赖于英语。恐怕如果你对一个关键字进行“查找”,可能会因为机器是俄语、中文或葡萄牙语而找不到。 @Bill 这是一种圣杯。我将不得不看看输出是否具有某种一致性。例如,PING 输出 3 是否等于该行上的符号和 2 个逗号。如果是这样,那么您可以使用FINDSTR
命令来匹配它以获得正确的行。
@Bill,请使用不同语言的人测试一下:将FIND
逻辑替换为FINDSTR
逻辑:findstr /R /C:".*=.*,.*=.*,.*=.*[^,]$"
@Bill FINDSTR
只负责确保它只抓取最后一行。我们仍然需要去掉毫秒缩写。我们不知道每种语言的缩写有多少个字符。
新年快乐...我根据用户语言/本地设置对 ping 结果和结果格式进行了一些研究。根据我所看到的,看起来所有语言都使用“ms”作为毫秒缩写,它只是格式化为“100ms”或“100ms”两种方式之一。所以我想知道这两种格式是否都包含在您提供的代码中?看看这个,我发现这很有用。 itefix.net/content/problem-checkwinpingexe以上是关于通过服务器排序并确定最快 ping 的简化方式的主要内容,如果未能解决你的问题,请参考以下文章