Ping + %time% con PowerShell

Con un simple ping nos vale para ver si una maquina esta levantada o no, pero cuando estamos haciendo seguimiento del estado de una maquina, o estamos haciendo una intervención y necesitamos recoger los tiempos de parada, nos interesa saber a que hora ha dejado de responder la maquina exactamente.
Podemos conseguir la información facilmente con un poco de powershell:

if ($args[0] -eq $null)
{
$strComputer=read-host "Maquina?"
}
else
{
$strComputer=$args[0]
}
$ping = new-object System.Net.Networkinformation.Ping
$a=0 #inicializo la variable para el bucle infinito
$coloranterior="x" #inicializo el color anterior a un valor cualquiera
do
{
$resultado=$ping.send($strComputer)
$hora=get-date -format T
#"DestinationHostUnreachable","TimedOut"
if ($resultado.status -eq "Success"){$color="white"}else{$color="darkgray"}
write-host "$hora Ping $($strComputer.toupper()) $($resultado.address) $($resultado.status)" -fore $color
if ($coloranterior -ne $color){$coloranterior=$color;out-file ".\pingtime.$strComputer.log" -input "$hora Ping $($strComputer.toupper()) $($resultado.address) $($resultado.status)" -append}
start-sleep -s 4 #segundos de espera entre pings
}
while ($a -eq 0) #BUCLE INFINITO


En la consola nos mostrara el resultado del ping cada 4 segundos, pintando la linea en rojo si da time out o en blanco si responde.
En el fichero log unicamente registrara los cambios de estado, es decir, el primer ping que de timeout o que responda.

Si quereis usar el cmdlet test-connection en lugar del objeto System.Net.Networkinformation.Ping:



$erroractionpreference="SilentlyContinue"
if ($args[0] -eq $null){$strComputer=read-host "Maquina?"}
else{$strComputer=$args[0]}
#-------variables a cambiar---------
$segundos=4
$logfile=".\pingtime.$strComputer.log"
#-----------------------------------
$msg="------- Ejecutando PingTime cada $segundos segundo(s) -------"
write-host $msg -fore cyan
out-file $logfile -input $msg -append
 do
 {
 $hora=get-date -uformat "%d/%m/%Y %H:%M:%S"
 $resultado = Test-Connection -ComputerName $strComputer -Count 1 -BufferSize 16
 if ($? -eq $true){$color="white";$status="Success ($($resultado.responsetime) ms)"}
 else{$color="darkgray";$status="TimedOut"}
 $msg="$hora Ping $($strComputer.toupper()) $status"
 write-host $msg -fore $color
 if ($coloranterior -ne $color){$coloranterior=$color;out-file $logfile -input $msg -append}
 start-sleep -s $segundos
 }
 while ($a -eq $null) #BUCLE INFINITO

El cmdlet test-connection tiene un parametro -quiet que nos devuelve unicamente $true o $false. En este caso no lo he usado porque me interesaba el tiempo de respuesta ($resultado.responsetime)

Comentarios