Организовать пинг нескольких сайтов по порядку с партией? - PullRequest
0 голосов
/ 13 июня 2018

Я искал, но не могу найти способ, который бы это делал.

Это пакет, который проверяет серверы игры, в которую я играю, так что я могу найти лучший сервер для себя.

Есть ли способ заставить его пропинговать все серверы, а затем перечислять их в порядке от самого медленного ответа до самого высокого?

Я ценю помощь!

@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

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Поскольку существует много хостов для проверки / проверки связи, последовательная обработка длится довольно долго, особенно при соблюдении Стефана рекомендации использования более чем эхо-запросов и принятиясреднее время ответа.

Поэтому я предлагаю использовать другой подход и разрешить пинг-запросы в одновременных процессах:

@title OSRS Ping Checker
@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ARG=%~1" & if defined _ARG shift /1 & goto :DO_PING & ^
    rem // (jump to label `DO_LOOP` in case arguments are provided)
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"
set "_ECHOREQUS=10" & rem // (number of echo requests to send per host)
set "_TEMPFILEB=%TEMP%\%~n0_%RANDOM%" & rem // (path and base name of temporary files)
set "_FINALFILE=%~dpn0.txt"           & rem // (path and full name of return file)

rem // Process items in sub-routine but in parallel processes:
for %%I in (%_USAWORLDS%) do (
    rem // Redirect output of every process to individual temporary file:
    > "%_TEMPFILEB%_%%~I.tmp" start /B "" cmd /C "%~f0" :DO_PING %%~I %_ECHOREQUS%
)
rem /* Wait until all temporary files are write-accessible, meaning that
rem    all the parallel processes have been completed/terminated: */
:POLL
for %%I in (%_USAWORLDS%) do (
    rem // Try appending nothing to check for write-access:
    2> nul (>> "%_TEMPFILEB%_%%~I.tmp" rem/) || (
        rem // Wait a bit to not overload the processor:
        > nul timeout /T 1 /NOBREAK
        goto :POLL
    )
)
rem // Combine all individual temporary files into one:
> nul copy /Y "%_TEMPFILEB%_*.tmp" "%_TEMPFILEB%.tmp" /B
rem // Sort data as desired (alphabetic sorting):
sort /R "%_TEMPFILEB%.tmp" /O "%_TEMPFILEB%.tmp"
rem // Create return file, write header:
> "%_FINALFILE%" echo ms      host
rem // Append sorted data to return file:
> nul copy /Y "%_FINALFILE%" + "%_TEMPFILEB%.tmp" "%_FINALFILE%" /B
rem // Clean up temporary files:
del "%_TEMPFILEB%_*.tmp" "%_TEMPFILEB%.tmp"

endlocal
exit /B


:DO_PING
    rem // Build host URL to ping, set number of echo requests to send:
    set "URL=oldschool%~1.runescape.com"
    set /A "NUM=%~2"
    rem /* Perform ping and capture last line of response, which should contain
    rem    the average reply time: */
    set "STR="
    for /F "delims=" %%P in ('2^> nul ping "%URL%" -n %NUM%') do set "STR=%%P"
    rem // Check whether last line of response contains average reply time:
    if not defined STR exit /B
    set "AVG=%STR:*Average =%"
    set "AVG=%AVG:~1%"
    if "%AVG%"=="%STR%" exit /B
    rem /* Convert average reply time to pure left-zero-padded number; the padding
    rem    is intended to simplify the later (purely alphabetic) sorting: */
    set /A "AVG=AVG"
    set "AVG=000000%AVG%"
    rem // Return average reply time together with respective host URL:
    echo %AVG:~-6%  "%URL%"
    exit /B
0 голосов
/ 13 июня 2018
@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

Примечание: время одноразового пинга не является надежным (проверьте время с помощью ping -t), и поэтому этот подход может дать вам ложные результаты.лучше отметьте «Среднее» с ping -n 5 или даже выше, но это, конечно, снизит производительность скрипта.

Чтобы сделать его быстрее и более надежным, используя среднее время, выможет запускать эхо-запросы параллельно (я использовал этот метод лет назад в другом контексте)

@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

Использование start /min вместо start /b сохраняет ваш экран чистым в случаеошибки (делает его немного медленнее, но вы этого не заметите)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...