batch file - lista - Crear un archivo de proceso por lotes que pings google constantemente y probar el tiempo de respuesta
como hacer un archivo bat autoejecutable (3)
Debido a que a veces PowerShell no es una opción, pensé en unir algunas cosas y hacer todo esto como un script por lotes.
Escribir un archivo por lotes para detectar anomalías de ping
¿Cómo tener múltiples colores en un archivo por lotes de Windows?
:: usage: badpings-color.bat [ip adress | hostname]
@echo off
set /a warnlimit=79 :: greater than this value is red
:: between the two values is yellow
set /a goodlimit=39 :: less than or equal to this value is green
if "%1"=="" (
set pingdest=google.com
) else (
set pingdest=%1
)
echo Pinging %pingdest%.
::echo Logging replies over %limit%ms.
echo Press Ctrl+C to end.
:Loop
for /f "usebackq tokens=1-6" %%a in (`ping -n 1 %pingdest% ^| findstr "Request Reply request"`) do (
set var=%%a %%b %%c %%d %%e %%f
set pingtimestr=%%e
)
if "%pingtimestr%"=="find" (
echo Ping request could not find host %pingdest%. Please check the name and try again.
goto End
)
if "%pingtimestr%"=="host" (
set /a pingtime=%warnlimit%+1
)
if not defined pingtimestr (
set /a pingtime=%warnlimit%+1
)
if "%pingtimestr:~0,4%"=="time" (
set /a pingtime=%pingtimestr:~5,-2%
)
if %pingtime% LEQ %goodlimit% (
call :c 02 "[%time%] %var%" /n
goto EndOfLoop
)
if %pingtime% LEQ %warnlimit% (
call :c 0E "[%time%] %var%" /n
goto EndOfLoop
)
if %pingtime% GTR %warnlimit% (
call :c 0C "[%time%] %var%" /n
goto EndOfLoop
)
:EndOfLoop
timeout /t 1 /nobreak >nul
Goto Loop
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: this section is from
:: https://stackoverflow.com/questions/4339649/how-to-have-multiple-colors-in-a-windows-batch-file/10407642#10407642
:c
setlocal enableDelayedExpansion
:colorPrint Color Str [/n]
setlocal
set "s=%~2"
call :colorPrintVar %1 s %3
exit /b
:colorPrintVar Color StrVar [/n]
if not defined DEL call :initColorPrint
setlocal enableDelayedExpansion
pushd .
'':
cd /
set "s=!%~2!"
:: The single blank line within the following IN() clause is critical - DO NOT REMOVE
for %%n in (^"^
^") do (
set "s=!s:/=%%~n/%%~n!"
set "s=!s:/=%%~n/%%~n!"
set "s=!s::=%%~n:%%~n!"
)
for /f delims^=^ eol^= %%s in ("!s!") do (
if "!" equ "" setlocal disableDelayedExpansion
if %%s==/ (
findstr /a:%~1 "." "/'" nul
<nul set /p "=%DEL%%DEL%%DEL%"
) else if %%s==/ (
findstr /a:%~1 "." "/./'" nul
<nul set /p "=%DEL%%DEL%%DEL%%DEL%%DEL%"
) else (
>colorPrint.txt (echo %%s/../')
findstr /a:%~1 /f:colorPrint.txt "."
<nul set /p "=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%"
)
)
if /i "%~3"=="/n" echo(
popd
exit /b
:initColorPrint
for /f %%A in (''"prompt $H&for %%B in (1) do rem"'') do set "DEL=%%A %%A"
<nul >"%temp%/'" set /p "=."
subst '': "%temp%" >nul
exit /b
:cleanupColorPrint
2>nul del "%temp%/'"
2>nul del "%temp%/colorPrint.txt"
>nul subst '': /d
exit /b
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:End
Intento crear un archivo por lotes que haga ping constantemente a google.com y verifique el tiempo de respuesta - "time = Xms".
- Si el tiempo <= 39ms, el texto de ese ping (o el fondo) debe ser verde.
- Si el tiempo> 40ms y <80ms el texto de ese ping (o el fondo) debe volverse naranja.
- Si el tiempo> = 80ms, el texto de ese ping (o el fondo) debería volverse rojo.
Tengo este lote en el momento en que pings google cada 3 segundos cambia el fondo de verde a rojo si la respuesta falla:
@echo off
:color 97
:start
PING -n 1 www.google.com
call :color
goto :start
:color
IF %ERRORLEVEL% EQU 0 (
COLOR 27
) else (
COLOR 47
ping -n 1 127.0.0.1 >nul
COLOR 74
ping -n 1 127.0.0.1 >nul
COLOR 47
)
ping -n 3 127.0.0.1 >nul
GOTO:EOF
Esto funciona bien, pero no sé cómo probar los tiempos de respuesta.
Hay algunos caprichos.
a) tienes que obtener el valor deseado de ping
para una variable. Use un for
para obtenerlo.
b) no puede compararlo directamente, porque if
compara cadenas, no números ( 2
es más grande que 10
). Agregue ceros a la cadena (y luego córtela a una longitud fija)
c) cmd
no tiene forma nativa de colorear líneas individuales (o caracteres). Se puede hacer con cmd
puro, pero creo que powershell
es una forma mucho mejor de hacerlo.
@echo off
:loop
set "tim=unreachable"
for /f "tokens=7 delims== " %%i in (''PING -n 1 www.google.com ^|find "TTL"'') do set "tim=%%i"
set "ti=0000%tim%"
set "ti=%ti:~-6,-2%"
if %ti% leq 0040 powershell write-host -foreground green %tim% & goto :loop
if %ti% leq 0080 powershell write-host -foreground yellow %tim% & goto :loop
powershell write-host -foreground red %tim% & goto :loop
Pruebe de esta manera:
@echo off
Title Echo Ping Reply
mode con cols=57 lines=6
::Choose how many seconds you must wait for the refresh
Set MyPause=3
:color 97
:start
CLS
echo.
ping www.google.com | findstr /i "TTL"
Timeout /Nobreak /t %MyPause% > Nul
call :color
goto :start
:color
IF %ERRORLEVEL% EQU 0 (
COLOR 27
) else (
COLOR 47
ping -n 1 127.0.0.1 >nul
COLOR 74
ping -n 1 127.0.0.1 >nul
COLOR 47
)
ping -n 3 127.0.0.1 >nul
GOTO:EOF