当我安装 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" }