Script en Windows para conectividad con servidores

Buenas,
estoy intentando hacer un script en Windows para comprobar si unos servidores (ip no consecutivas) están levantados. Investigando un poco en internet, he cogido algo y lo he modificado, pero veo mucha información contradictoria a la hora de hacer un .bat (que creo que es con bash) el lo que se refiere a expresiones. Actualmente lo que tengo es lo siguiente, pero siempre me sale OK:

@echo off


set l1= Server 1 ---


set ok=OK
set nok=X
set h1='X.X.X.X'

for /f %%i in ('ping h1 ^| find /c "(0%% loss)"') do SET MATCHES=%%i
echo %errorlevel%


if not errorlevel 1 set error=%l1%%ok%
if errorlevel 1 set error=%l1%%nok%
cls
echo Result: %error%

pause


Gracias a todos!
Te adjunto un código más simple y podrás desarrollar a partir de éste según las IPs / dominios que quieras testear ;)

@echo off

echo Realizando ping, usa CTRL-C para detenerlo
:start
ping -n 1 ElOtroLado.net | find "TTL=" >>%userprofile%\Desktop\PingTest.txt
echo .
ping -n 16 127.0.0.1>nul
goto start



El el fichero te almacenará únicamente los levantados [oki]
No es la respuesta a lo que preguntas especificamente, pero si tienes que monitorizar muchos servidores y quieres a parte de mirar si hacen ping otras cosas como ram, disco, cpu... Monta un nagios, no necesitas mucho harware para hacerlo.
Buenas!,
disculpa la tardanza en contestar, pero hice doblete en el trabajo [agggtt]

Entiendo que tu código guarda en PingTest el resultado del ping, pero que significa el "127.0.0.1>nul" ¿si es diferente de nulo?, osea que funciona el ping a sí mismo. ¿Es correcto?

Por otra parte, estoy pensando en un código que me sea reutilizable para más server, por lo que pensaba en algo así.
set h1=X.X.X.X


if ping h1 | find "TTL=" (set ok=OK) else (set ok=X)
echo %ok%
pause



El problema es que busco en internet como hacer las sentencias condiciones en .bat, y leo eso, pero mi Windows no me reconoce las sentencias if / else.

Por lo que he probado algo así, pero tampoco funciona

set t=10.144.0.253


ping t | find "TTL="
if errorlevel 1 set ok=X
if not errorlevel 1 set ok=OK
echo %ok%
pause


El error está en que siempre me devuelve errorlevel 1 el find, vamos que no encuentra la cadena.


@biziraum, tiene que ser algo fácil por el cmd de windows, que haga ping y poco más.
Revisa ésto:
stackoverflow.com/questions/13713318/ping-all-addresses-in-network-windows
Nada, ya está solucionado.
El falló estaba en que no había puesto %% en la variable para hacer ping

if ping %h1% | find "TTL="

Gracias a todos!
KS-Soft.Advanced.Host.Monitor.v9.32.Enterprise
Veronisoft.Get.Ip.And.Host.v1.4.8-

Tools de testeo.


Por cierto chicos, viendo que los scripts os molan.

Como podría hacer que:

un comando cmd, se aplique si previamente responde a ping.

Tengo un bat que copia en all users de los puestos, lo que sea... un acceso directo un txt... lo que sea.
Pero claro hay veces que los pcs no estan levantados. o lo que sea.
Se os ocurre algo para que escanee todo el rango, y si responde a ping, ejecute el bat.
Pues, por ejemplo y siguiendo con el script de antes, aplicando la condición IF donde el ERRORLEVEL no es 1 pedimos que llame a la rutina batch en cuestión (archivo.cmd). Si ya lo metemos todo dentro de un bucle con FOR, podemos hacerlo todo junto.
@ECHO OFF
set range=10.100.27

for /l %%x in (0, 1, 255) do (
   ping -n 2 -w 250 %range%.%%x | find "TTL=" > nul
   if errorlevel 1 echo %range%.%%x - Connection FAILED
   if not errorlevel 1 (
      echo %range%.%%x - Connection SUCCEEDED
      call archivo.cmd
   )
)

Puedes ya dedicarte a quitar los "Connection SUCCEEDED/FAILED" o a maquear el script al gusto para que muestre más o menos texto; a mi es que me gusta que "hablen" poco y directo. :p

Y si ya queremos que compruebe los dos últimos octetos (10.100.x.y) entonces hay que hacer un doble FOR. No sé si merece ya la pena, sinceramente.



PD: Windows hace ya tiempo que tiene su propio comando "sleep". No es necesario andar haciendo ping a direcciones inexistentes con tiempos de espera preestablecidos para simular el sleep. El comando es TIMEOUT
TIMEOUT <tiempo_en_segundos>
8 respuestas