
當我安裝 Windows 更新或執行其他維護(有時涉及一次或多次自動重新啟動)時,多年來我一次又一次地遇到同樣的挑戰:
如何檢查與特定設備的網路連線是否中斷以及如何使用時間碼記錄此情況?即使中斷只持續幾秒鐘,就像重新啟動虛擬機器時很常見的那樣。
如何在不長時間搜尋日誌檔案的情況下找出網路連線中斷(=重新啟動)發生的時間和持續時間?
有沒有什麼方法可以在不使用特殊軟體的情況下解決這個挑戰?只能使用 PowerShell 等 Windows 工具?
答案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 的解決方案:
連續 ping 主機並寫入回應和時間碼到文字檔案(但也將其顯示在螢幕上)。您可以在此處使用 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" }