![Как узнать, был ли потерян пинг или не получен ответ?](https://rvso.com/image/776305/%D0%9A%D0%B0%D0%BA%20%D1%83%D0%B7%D0%BD%D0%B0%D1%82%D1%8C%2C%20%D0%B1%D1%8B%D0%BB%20%D0%BB%D0%B8%20%D0%BF%D0%BE%D1%82%D0%B5%D1%80%D1%8F%D0%BD%20%D0%BF%D0%B8%D0%BD%D0%B3%20%D0%B8%D0%BB%D0%B8%20%D0%BD%D0%B5%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%20%D0%BE%D1%82%D0%B2%D0%B5%D1%82%3F.png)
Когда я устанавливаю обновления Windows или выполняю другие операции по обслуживанию, которые в какой-то момент подразумевают одну или несколько автоматических перезагрузок, я снова и снова на протяжении многих лет сталкиваюсь с одной и той же проблемой:
Как проверить, было ли прервано сетевое подключение к определенному устройству, и как зарегистрировать это с помощью таймкода? Даже если прерывание длилось всего несколько секунд, как это часто бывает при перезагрузке виртуальной машины.
Как узнать, когда и как долго произошел сбой сетевого подключения (= перезагрузка), не прибегая к долгому поиску в лог-файлах?
Есть ли способ решить эту задачу без специального программного обеспечения? Только с помощью инструментов 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:
Постоянно пингуйте хост и пишите ответстаймкод в текстовый файл (но также отображать его на экране). Здесь вы можете использовать IP-адрес или имя хоста:
$computer = "192.168.1.29"; ping.exe -t $computer | Foreach{"{0} - {1}" -f (Get-Date),$_} | Tee "$env:userprofile\documents\Ping_$computer.txt" -append
Откройте второе окно PowerShell и введите следующую команду. Это будет непрерывно отслеживать текстовый файл из окна PowerShell №1 и выводить все строки, которые НЕ содержат строку "Reply". То есть все случаи, когда ping не работал.
Get-content "$env:userprofile\documents\Ping_192.168.1.29.txt" -Tail 0 -Wait | where { $_ -NotMatch "Reply" }