Как узнать, был ли потерян пинг или не получен ответ?

Как узнать, был ли потерян пинг или не получен ответ?

Когда я устанавливаю обновления Windows или выполняю другие операции по обслуживанию, которые в какой-то момент подразумевают одну или несколько автоматических перезагрузок, я снова и снова на протяжении многих лет сталкиваюсь с одной и той же проблемой:

  1. Как проверить, было ли прервано сетевое подключение к определенному устройству, и как зарегистрировать это с помощью таймкода? Даже если прерывание длилось всего несколько секунд, как это часто бывает при перезагрузке виртуальной машины.

  2. Как узнать, когда и как долго произошел сбой сетевого подключения (= перезагрузка), не прибегая к долгому поиску в лог-файлах?

  3. Есть ли способ решить эту задачу без специального программного обеспечения? Только с помощью инструментов Windows, таких как PowerShell?

решение1

Обычно я использую этот скрипт для наблюдения за включением и выключением одного или нескольких компьютеров.

# 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

решение2

Решение с PowerShell и Windows 10 / Windows Server >= 2016:

  1. Постоянно пингуйте хост и пишите ответстаймкод в текстовый файл (но также отображать его на экране). Здесь вы можете использовать IP-адрес или имя хоста:

    $computer = "192.168.1.29"; ping.exe -t $computer | Foreach{"{0} - {1}" -f (Get-Date),$_} | Tee "$env:userprofile\documents\Ping_$computer.txt" -append
    
  2. Откройте второе окно PowerShell и введите следующую команду. Это будет непрерывно отслеживать текстовый файл из окна PowerShell №1 и выводить все строки, которые НЕ содержат строку "Reply". То есть все случаи, когда ping не работал.

    Get-content "$env:userprofile\documents\Ping_192.168.1.29.txt" -Tail 0 -Wait | where { $_ -NotMatch "Reply" }
    

Связанный контент