Windows の更新プログラムをインストールしたり、ある時点で 1 回以上の自動再起動を伴うその他のメンテナンスを実行したりすると、何年もの間、同じ問題が何度も発生していました。
特定のデバイスへのネットワーク接続が中断されたかどうかを確認し、タイムコードを使用してこれをログに記録するにはどうすればよいでしょうか。VM を再起動するときによくあることですが、中断が数秒しか続かなかったとしてもです。
ログファイルを長時間検索せずに、ネットワーク接続の中断 (= 再起動) がいつ、どのくらいの時間発生したかを調べるにはどうすればよいでしょうか?
特別なソフトウェアを使わずにこの課題を解決する方法はありますか? PowerShell などの Windows ツールのみでしょうか?
答え1
私は通常、このスクリプトを使用して、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
2 番目の PowerShell ウィンドウを開き、次のコマンドを入力します。これにより、PowerShell ウィンドウ #1 からのテキスト ファイルが継続的に監視され、文字列 "Reply" を含まないすべての行が出力されます。つまり、ping が機能しなかったすべての時間が出力されます。
Get-content "$env:userprofile\documents\Ping_192.168.1.29.txt" -Tail 0 -Wait | where { $_ -NotMatch "Reply" }