
Когда я устанавливаю обновления 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" }