“ping -t”のようにPowerShellでも連続してping疎通する方法
概要
コマンドプロンプトでは、コマンド「ping -t "IPアドレス、またはホスト名"
」で連続してPing疎通可能です。
このコマンドプロンプトのコマンドは、PowerShellでも呼び出せるため、今まで不都合はなかったのですが、
プロンプト表示がレガシーすぎるなと、ずっと感じていました。
今回は、コマンドプロンプトではなくPowerShellのコマンドレットを使用し、
Ctrl + C
などのブレーク送信をするまで連続してping疎通する方法の紹介です。
この記事のターゲット
- PowerShell ユーザーの方
- PowerShellで連続してping疎通する方法
今まで使用していたコマンドプロンプトのコマンド「ping -t」
下記が実際に実行した結果です。
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-Connection
や Test-NetConnection
という通信系のコマンドレットがある事を知り、
それらのコマンドレットでもping疎通ができそうだったので深掘りして調べてみました。
PowerShellで連続しping疎通する方法
PowerShellで連続してping疎通する方法は、PowerShellのバージョン毎によって異なります。
-
PowerShell 7.2以前
Windows 10/11 で標準インストールされている5.1
やPowerShell Coreの6.0 ~ 6.2
、7.0 ~ 7.2
が対象。
Test-Connection
やTest-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を作成してみました。
# 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
}
}
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
」が実装されました。
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のコマンドレットで実現可能。
- バージョン7.2以前
関連記事
Discussion