はじめに
バディットコンサルティングのITエンジニア wahooです。今回は、ネットワーク機器の検証をした時、障害発生時の断時間を計測したくなったのですが、一般的にみなさん使っているExPingを使用すると、1秒以下の時間の計測ができず、もう少し、正確な断時間の計測ができないかなと思い、他に良い方法がないかと考えてみました。
まずは、1秒以下の計測ができるPingツールがないかと、インターネットを検索してみました。しかし、これなら、というツールは、なかなか無いもので、検索中にプログラミングしている記事があったので、自作することにしました。
プログラム構成
GUIがあると便利なので、簡単に作成できるPowerShellをメインにすることにしました。また、Pingコマンドは、DOSのコマンドをそのまま呼び出す形にします。
ファイル構成
- psping.ps1
- ping-command.bat
- psping_powershell.txt
- psping.csv
psping.ps1
PowerShellで作成したメインの簡易Pingプログラム。
ping-command.bat
Pingコマンドを実行するDOSのバッチファイル。PowerShellのプログラムから実行します。
psping_powershell.txt
今回作成した簡易Pingプログラムの簡易説明書。
psping.csv
実行した結果が書き込まれるログファイルです。
プログラム
psping.ps1
# pingを実行する宛先を指定する
$targets = "192.168.1.254"
# 設定
# pingを実行する間隔(ミリ秒)
$interval = 1
# 繰り返し数
$repeat = 50
# タイムアウト値
$timeout = "100"
# pingコマンドへの引数生成
$arg = $targets + " " + $timeout
# 実行中のパス取得/移動
$path = Split-Path -Parent $MyInvocation.MyCommand.Path
Set-Location $path
# ログファイル名
$logFileName = "psping.csv"
# ファイル読み込み
# StreamReaderのコンストラクタに直接 「$path + "\test.txt"」を入力するとエラーになるので分ける
$fileName = $path + "\" + $logFileName
$file = New-Object System.IO.StreamWriter($fileName, $false, [System.Text.Encoding]::GetEncoding("sjis"))
@(1..$repeat) | foreach {
$targets | foreach {
# 間隔をあけるためのsleep
Start-Sleep -Milliseconds $interval
# 開始時刻
$datetime1 = Get-Date -F "yyyy/MM/dd HH:mm:ss.fff"
# ping実行
$p = Start-Process ping-command.bat $arg -NoNewWindow -PassThru -Wait
$ret = $p.ExitCode
if ( $ret -eq 0 ) {
# 結果の格納
$result = "OK"
} else {
# 失敗した場合
$result = "NG"
}
# 終了時刻
$datetime2 = Get-Date -F "yyyy/MM/dd HH:mm:ss.fff"
# CSV形式で結果情報を作成
$row = $result + "," + $datetime1 + "," + $datetime2 + "," + $targets + ","
$file.WriteLine($row)
# CSVからオブジェクトを出力
$row | ConvertFrom-Csv -Header @("Result","StartTime","EndTime","Target")
$p.Close()
}
} | Out-GridView -Title "Ping Results" -PassThru # グリッドビューを表示する
$file.Close()
Read-Host "続けるには Enter キーを押してください..."
ping-command.bat
@echo off
ping -n 1 -w %2 %1 | find "ms TTL=" > NUL
exit ERRORLEVEL
実行方法
最初に、psping.ps1ファイルの先頭にある設定項目を編集します。各変数の意味は、以下の通りです。
$targets
Pingの宛先を指定します。DNSの設定ができていれば、FQDNを指定してもOKです。
$interval
Pingを実行する間隔(ミリ秒)を指定します。
$repeat
Pingの最大繰り返し数を指定します。
$timeout
Pingのタイムアウト値を指定します。
次に、psping.ps1ファイルを右クリックして、”PowerShellで実行”で実行できます。

この様に、Pingコマンドを実行する直前・直後の時間が、1/1000秒まで表示されるので、少しだけ、正確な時間の計測ができるようになります。
ログファイル
NG,2019/07/09 10:47:29.921,2019/07/09 10:47:30.984,192.168.1.254,
NG,2019/07/09 10:47:31.525,2019/07/09 10:47:32.598,192.168.1.254,
NG,2019/07/09 10:47:32.603,2019/07/09 10:47:33.675,192.168.1.254,
NG,2019/07/09 10:47:33.682,2019/07/09 10:47:34.759,192.168.1.254,
NG,2019/07/09 10:47:34.775,2019/07/09 10:47:35.840,192.168.1.254,
NG,2019/07/09 10:47:35.853,2019/07/09 10:47:36.927,192.168.1.254,
NG,2019/07/09 10:47:36.931,2019/07/09 10:47:38.010,192.168.1.254,
NG,2019/07/09 10:47:38.025,2019/07/09 10:47:39.100,192.168.1.254,
NG,2019/07/09 10:47:39.103,2019/07/09 10:47:40.179,192.168.1.254,
NG,2019/07/09 10:47:40.197,2019/07/09 10:47:41.273,192.168.1.254,
NG,2019/07/09 10:47:41.291,2019/07/09 10:47:42.368,192.168.1.254,
NG,2019/07/09 10:47:42.385,2019/07/09 10:47:43.463,192.168.1.254,
NG,2019/07/09 10:47:43.479,2019/07/09 10:47:44.558,192.168.1.254,
NG,2019/07/09 10:47:44.572,2019/07/09 10:47:45.634,192.168.1.254,
NG,2019/07/09 10:47:45.650,2019/07/09 10:47:46.728,192.168.1.254,
NG,2019/07/09 10:47:46.745,2019/07/09 10:47:47.820,192.168.1.254,
この様に、CSV形式でファイルに保存されます。
まとめ
PowerShellとDOSのPingコマンドがわかれば、割と簡単に作成することができると思います。
なお、Windows 7の環境で実行する際、WMF(Windows Management Framework) 5.1が必要になりました。インストールされてない場合、インストールをして下さい。
インターネットを検索すると、たくさんの情報が出てくるので、自分のやりたいことに近い記事を参考にすれば、簡単に作成することができると思います。皆さんも、チャレンジしてみて下さい。
では、また、次回!!