PoorShell で Ping を計測
〜 DOS の BAT ではできない処理の記述 〜
2020-10-26 作成 福島
2020-12-08 更新 福島
2021-01-01 更新 福島
TOP > tips > ps1pinglog
1. 事前準備
スクリプトの実行禁止を解除しておく。

PowerShell を管理者として実行
スタート (右クリック) から「Windows PowerShell(管理者)(A)」を選択

 >_ 管理者: Windows PowerShell 
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS C:\WINDOWS\system32> Get-ExecutionPolicy               # スクリプトの実行ポリシーを確認
Restricted                     # スクリプトの実行が制限されている
PS C:\WINDOWS\system32> Set-ExecutionPolicy RemoteSigned  # ローカルファイルのスクリプトを実行可能にする

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_E
xecution_Policies のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ
(既定値は "N"):Y                                          # Y を入力する
PS C:\WINDOWS\system32> Get-ExecutionPolicy
RemoteSigned                   # ローカルファイルのスクリプトが実行可能になった
PS C:\WINDOWS\system32> exit

2. スクリプトファイルの作成
ファイル名: pinglog.ps1
# ファイル名: pinglog.ps1

if ($Args.length -le 0) {
    # 引数なしで実行された場合は使い方を表示して終了する
    "'ping_HOST_YYYYMMDD 曜日.csv' を作成するスクリプト。"
    "使い方: PowerShell.exe pinglog.ps1 HOST"
    "  例: PowerShell.exe pinglog.ps1 www.example.com"
    exit
}

$pingTo = $Args[0]  # ICMP パケットの送信先

$getdate = Get-Date -format "yyyyMMddHH:mm:ssddd"
$date = $getdate.Substring(0,8)         # 日付 YYYYMMDD ログファイル名に使用する
$time = $getdate.Substring(8,8)         # 時刻 HH:MM:SS
$wday = $getdate.Substring(16,1)        # 曜日 日月火水木金土

$logFile = "ping_" + $pingTo + "_" + $date + " " + $wday + ".csv" # ログファイルを指定する

# ログファイルの最初の行に項目名を入れる
if ((Test-Path $logFile) -eq $false) {
    Write-Output "$pingTo,時刻,パケットロス(%),遅延(ms)" | Add-Content $logFile
}

$pingResult = ping -n 10 $pingTo        # ping を 10 回実行する

# ping の実行結果から パケットロス率、平均時間 を取り出す
$pktLoss = $null
$avrTime = $null
foreach ( $line in $pingResult ) {
    if ($line -match "\((?<PktLoss>.*?)% の損失\)") { $pktLoss = $Matches.PktLoss }
    if ($line -match "平均 = (?<AvrTime>.*?)ms")    { $avrTime = $Matches.AvrTime }
}

# 送信先、時刻、パケットロス率、平均時間 をログファイルに追記する
Write-Output "$pingTo,$time,$pktLoss,$avrTime" | Add-Content $logFile
3. 実行する
PowerShell を実行 (管理者でなくても可)
スタート (右クリック) から「Windows PowerShell(I)」を選択

 >_ Windows PowerShell 
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS C:\WINDOWS\system32> powershell.exe .\pinglog.ps1 www.example.com
PS C:\WINDOWS\system32> exit
※ powershell.exe のフルパスは C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
※タスクスケジューラーに登録する場合はフルパスを指定する。