por lotes lista hacer ejemplos crear como comandos batch bat avanzados autoejecutable archivos archivo batch-file testing cmd ping

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