📌

“ping -t”のようにPowerShellでも連続してping疎通する方法

2024/03/01に公開

概要

コマンドプロンプトでは、コマンド「ping -t "IPアドレス、またはホスト名"」で連続してPing疎通可能です。
このコマンドプロンプトのコマンドは、PowerShellでも呼び出せるため、今まで不都合はなかったのですが、
プロンプト表示がレガシーすぎるなと、ずっと感じていました。

今回は、コマンドプロンプトではなくPowerShellのコマンドレットを使用し、
Ctrl + Cなどのブレーク送信をするまで連続してping疎通する方法の紹介です。

この記事のターゲット

  • PowerShell ユーザーの方
  • PowerShellで連続してping疎通する方法

今まで使用していたコマンドプロンプトのコマンド「ping -t」

下記が実際に実行した結果です。

コマンドプロンプトで連続してping疎通
Microsoft Windows [Version 10.0.19045.4046]
(c) Microsoft Corporation. All rights reserved.

C:\Users\"ユーザー名">ping -t www.bing.com

e86303.dscx.akamaiedge.net [23.52.106.66]に ping を送信しています 32 バイトのデータ:
23.52.106.66 からの応答: バイト数 =32 時間 =25ms TTL=55
23.52.106.66 からの応答: バイト数 =32 時間 =23ms TTL=55
23.52.106.66 からの応答: バイト数 =32 時間 =22ms TTL=55
23.52.106.66 からの応答: バイト数 =32 時間 =22ms TTL=55
23.52.106.66 からの応答: バイト数 =32 時間 =23ms TTL=55
23.52.106.66 からの応答: バイト数 =32 時間 =23ms TTL=55
23.52.106.66 からの応答: バイト数 =32 時間 =22ms TTL=55
23.52.106.66 からの応答: バイト数 =32 時間 =23ms TTL=55
23.52.106.66 からの応答: バイト数 =32 時間 =28ms TTL=55

23.52.106.66 の ping 統計:
    パケット数: 送信 = 9、受信 = 9、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 22ms、最大 = 28ms、平均 = 23ms
Ctrl+C
^C
C:\Users\"ユーザー名">

なかなかレガシーな感じですよね。

PowerShellでは、pingコマンド以外にもコマンドプロンプトのコマンドをそのまま使用可能です。
今までサーバーやパソコンを再起動した際に、他の端末で「ping -t」コマンドでping監視し、
起動したかチェックしていました。
(ちなみにping /tでも実行可能。)

以前、PowerShellにおけるポート疎通確認の方法を調べていた時(こちらの記事)に Test-ConnectionTest-NetConnection という通信系のコマンドレットがある事を知り、
それらのコマンドレットでもping疎通ができそうだったので深掘りして調べてみました。

https://zenn.dev/haretokidoki/articles/1c671247e9523c

PowerShellで連続しping疎通する方法

PowerShellで連続してping疎通する方法は、PowerShellのバージョン毎によって異なります。

  • PowerShell 7.2以前
    Windows 10/11 で標準インストールされている5.1やPowerShell Coreの6.0 ~ 6.27.0 ~ 7.2が対象。
    Test-ConnectionTest-NetConnectionなどPowerShellのコマンドレットのみでは実現できません
    どうしてもPowerShellのコマンドレットを使用したい場合は、自作のFunctioonを作成するなどの対応が考えられます。

  • PowerShell 7.3以降
    バージョン7.3の破壊的変更によりTest-Connectionの仕様が変わりました。
    その変更でRepeatオプションが追加されています。そのRepeatオプションを使用する事で連続してping疎通が可能です。

PowerShell 7.2以前で連続してping疎通する方法

バージョン7.2以前では、Test-ConnectionコマンドレットにRepeatオプションがありません。
手っ取り早いのは、今までどおりコマンドプロンプトの「ping -t」を使った方が良いです。

どうしてもPowerShellのコマンドレットだけで実現したい場合、自作のFunctionの作成が必要です。
実際に連続してping疎通ができるFunctionを作成してみました。

PowerShell 7.2以前:自作のFunctionを作成
# Functionの定義
Function PingRepeat{
    param(
        [System.String]$target_host = 'localhost',
        [System.Int32]$interval = 1000
    )
    # ブレーク送信されるまで繰り返し
    while ($true) {
        try {
            # ping実行
            [Microsoft.PowerShell.Commands.TestConnectionCommand+PingStatus]$ping_data = Test-Connection $target_host -Count 1 -ErrorAction Stop
            # 画面に結果表示
            [System.String]$now_datetime = Get-Date -Format "yyyy/MM/dd HH:mm:ss.fff"
            # ResponseTimeが0の場合、nullになるため判定する
            if ($null -eq $ping_data.ResponseTime) {
                # ResponseTImeがnullの場合は、固定値"0 ms"
                Write-Output "$now_datetime, $target_host, 0 ms"
            }
            else {
                # nullではない場合、取得した値を設定
                Write-Output "$now_datetime, $target_host, $($ping_data.ResponseTime) ms"
            }
        }
        catch {
            Write-Host "エラー:$($_.Exception.Message)" -ForegroundColor Red
            # 「ping -t」の挙動に合わせ、ping疎通が取れなくても処理を続行する。
            # もし、NGとなった場合に処理を中断したい場合は、ここで「break」を実行。
            # break
        }
        # 間隔をあける
        Start-Sleep -Milliseconds $interval
    }
}
PowerShell 7.2以前:自作Functionを実行
PS C:\Users\"ユーザー名"> PingRepeat www.bing.com
2024/02/22 13:39:52.273, www.bing.com, 26 ms
2024/02/22 13:39:53.329, www.bing.com, 50 ms
2024/02/22 13:39:54.379, www.bing.com, 24 ms
2024/02/22 13:39:55.667, www.bing.com, 247 ms
2024/02/22 13:39:56.733, www.bing.com, 48 ms
2024/02/22 13:39:57.821, www.bing.com, 62 ms
2024/02/22 13:39:58.846, www.bing.com, 20 ms
2024/02/22 13:39:59.896, www.bing.com, 20 ms
PS C:\Users\"ユーザー名">

ping -tでは、Ctrl + Cでping疎通を中断した場合、自動的に統計結果が表示されますが、
このFunctionでは統計結果の表示は行いません。

正直、劣化版のping -tっていう感じですね 😅

PowerShell 7.3以降で連続してping疎通する方法

バージョン7.3以降では破壊的変更(仕様動作の変更)があり、その変更でオプション「-Repeat」が実装されました。

PowerShell 7.3以降:新たに実装されたオプションをつけて実行
PS C:\Users\"ユーザー名"> Test-Connection www.bing.com -Repeat

   Destination: www.bing.com

Ping Source           Address                   Latency BufferSize Status
                                                   (ms)        (B)
---- ------           -------                   ------- ---------- ------
   1 xxxxxxxx         23.52.106.99                   22         32 Success
   2 xxxxxxxx         23.52.106.99                   23         32 Success
   3 xxxxxxxx         23.52.106.99                   20         32 Success
   4 xxxxxxxx         23.52.106.99                   19         32 Success
   5 xxxxxxxx         23.52.106.99                   76         32 Success
   6 xxxxxxxx         23.52.106.99                   20         32 Success
   7 xxxxxxxx         23.52.106.99                   20         32 Success
   8 xxxxxxxx         23.52.106.99                   20         32 Success
PS C:\Users\"ユーザー名">

コマンド結果の項目"Source"にあるxxxxxxxxは、コンピューター名が入る。コンピューター名に個人情報が含まれているので、マスキングしています。
Test-Connectionの実行結果は、表形式のような見た目のため、パッとみてわかりやすいのが良いですね。

まとめ

  • PowerShellで連続してping疎通する方法を調べた
  • 調べた結果、PowerShellのバージョンによって方法が変わる
    • バージョン7.2以前
      Test-ConnectionコマンドレットにRepeatオプションがない。
      今までどおり「ping -t」を使用するか自作のFunctionを作成する必要があり。
    • バージョン7.3以降
      Test-ConnectionコマンドレットにRepeatオプションがあり、簡単にPowerShellのコマンドレットで実現可能。

関連記事

https://zenn.dev/haretokidoki/articles/1c671247e9523c
https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960

GitHubで編集を提案

Discussion