PowerShellとDOSを使って、簡易Pingをプログラミングしてみた

はじめに

バディットコンサルティングの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が必要になりました。インストールされてない場合、インストールをして下さい。

インターネットを検索すると、たくさんの情報が出てくるので、自分のやりたいことに近い記事を参考にすれば、簡単に作成することができると思います。皆さんも、チャレンジしてみて下さい。

では、また、次回!!

タイトルとURLをコピーしました