Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
739 views
in Technique[技术] by (71.8m points)

windows - Arrange the pinging of multiple website in order with batch?

This is a batch that pings the servers of a game I play, so that I am able to find the best server for me.

Is there a way I can have it ping all the servers then list them in order from the slowest response to the highest?

@TITLE OSRS Ping Checker
@ECHO off

SET usaworlds=5,6,7,13,14,15,19,20,21,22,23,24,29,30,31,32,37,38,39,40,45,46,47,48,53,54,55,56,57,61,62,69,70,74,77,78,86,117

@ECHO --------------------------------------------------- 
@ECHO                     USA
@ECHO --------------------------------------------------- 
FOR %%i IN (%usaworlds%) DO (
Echo | SET /p=World %%i
FOR /F "tokens=5" %%a IN ('Ping oldschool%%i.runescape.com -n 1 ^| FIND "time="') DO Echo %%a
)

PAUSE
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
@ECHO off
setlocal enabledelayedexpansion
TITLE OSRS Ping Checker

for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
del x.tmp 2>nul

SET usaworlds=5,6,7,13,14,15,19,20,21,22,23,24,29,30,31,32,37,38,39,40,45,46,47,48,53,54,55,56,57,61,62,69,70,74,77,78,86,117

ECHO --------------------------------------------------- 
ECHO                     USA
ECHO --------------------------------------------------- 
FOR %%i IN (%usaworlds%) DO (
  <nul set /p "=checking World %%i  !CR!"
  FOR /F "tokens=5" %%a IN ('Ping oldschool%%i.runescape.com -n 1 ^| FIND "TTL="') DO (
    for /f "tokens=2 delims==" %%b in ("%%a") do ( 
      set tim=00000%%b
      set tim=!tim:~-7,-2!
    )
  )
  echo !tim! World %%i>>x.tmp
)
for /f "tokens=3" %%c in ('sort /r x.tmp') do set fastest=%%c
echo fastest response from World %fastest%
PAUSE

Note: the time of a one-time ping isn't reliable (check the different times with ping -t) and so this approach may give you false results. better check "Average" with ping -n 5 or even higher, but that will of course decrease the performance of the script.

To make it faster and more reliable using the average times, you can run the pings in parallel (I have used that method years ago in another context)

@ECHO off
setlocal 
TITLE OSRS Ping Checker
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
del %temp%x.tmp 2>nul
SET usaworlds=wrgl,5,6,7,13,14,15,19,20,21,22,23,24,29,30,31,32,37,38,39,40,45,46,47,48,53,54,55,56,57,61,62,69,70,74,77,78,86,117

@ECHO --------------------------------------------------- 
@ECHO                     USA
@ECHO --------------------------------------------------- 
FOR %%i IN (%usaworlds%) DO (
   start /min "Pinging" cmd /v:on /c "(FOR /F "tokens=9 delims= " %%a IN ('Ping oldschool%%i.runescape.com -n 5^|findstr /e "ms"') do set avrg=       %%a)& >> %temp%x.tmp echo ^!avrg:~-7,-2^!" World %%i
)
:wait
timeout 1 >nul
tasklist /FI "WINDOWTITLE eq Pinging" |find ".exe" >nul && goto :wait
for /f "tokens=3" %%c in ('sort /r %temp%x.tmp') do set fastest=%%c
echo fastest response from World %fastest%
PAUSE

Using start /min instead of start /b does keep your screen clean in case of errors (makes it a bit slower, but you won't notice it)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...