![Como posso saber quando um Ping foi perdido ou não respondido?](https://rvso.com/image/776305/Como%20posso%20saber%20quando%20um%20Ping%20foi%20perdido%20ou%20n%C3%A3o%20respondido%3F.png)
Quando instalo atualizações do Windows ou realizo outra manutenção que em algum momento envolve uma ou mais reinicializações automáticas, enfrento o mesmo desafio repetidamente há anos:
Como posso verificar se a conexão de rede com um dispositivo específico foi interrompida e como posso registrar isso com timecode? Mesmo que a interrupção tenha durado apenas alguns segundos, como é comum ao reiniciar uma VM.
Como posso descobrir quando e por quanto tempo ocorreu a interrupção da conexão de rede (= reinicialização) sem uma longa pesquisa nos arquivos de log?
Existe alguma maneira de resolver esse desafio sem software especial? Somente com ferramentas do Windows como o PowerShell?
Responder1
Normalmente uso esse script para observar um ou mais computadores ligando e desligando.
# pinger.ps1
# example: pinger comp01
# pinger $list
param ($hostnames)
$pingcmd = 'test-connection'
$sleeptime = 1
$sawup = @{}
$sawdown = @{}
foreach ($hostname in $hostnames) {
$sawup[$hostname] = $false
$sawdown[$hostname] = $false
}
while ($true) {
foreach ($hostname in $hostnames) {
if (& $pingcmd -count 1 $hostname -ea 0) {
if (! $sawup[$hostname]) {
echo "$([console]::beep(500,300))$hostname is up $(get-date)"
$sawup[$hostname] = $true
$sawdown[$hostname] = $false
}
} else {
if (! $sawdown[$hostname]) {
echo "$([console]::beep(500,300))$hostname is down $(get-date)"
date}
$sawdown[$hostname] = $true
$sawup[$hostname] = $false
}
}
}
sleep $sleeptime
}
pinger comp01,comp02
comp01 is up 12/02/2022 13:16:47
comp02 is up 12/02/2022 13:16:47
Responder2
Solução com PowerShell e Windows 10/Windows Server >= 2016:
Faça ping no host continuamente e escreva a respostacomtimecode para um arquivo de texto (mas também exibi-lo na tela). Você pode usar um endereço IP ou nome de host aqui:
$computer = "192.168.1.29"; ping.exe -t $computer | Foreach{"{0} - {1}" -f (Get-Date),$_} | Tee "$env:userprofile\documents\Ping_$computer.txt" -append
Abra uma segunda janela do PowerShell e digite o seguinte comando. Isso monitorará continuamente o arquivo de texto da janela nº 1 do PowerShell e gerará todas as linhas que NÃO contêm a string "Resposta". Então, todos os momentos em que o ping não funcionou.
Get-content "$env:userprofile\documents\Ping_192.168.1.29.txt" -Tail 0 -Wait | where { $_ -NotMatch "Reply" }