見出し画像

Ping疎通不通の際にビープ音を鳴らしてお知らせするPowershellスクリプト【BeepPing1.3】

今までPingで疎通確認する際にExpingという疎通確認ツールを使っていたのですが不通の際に音を鳴らして知らせてくれないのでChatGPTにPowershellのツールを作ってもらいました。とりあえずBeepPingと命名します。
ちなみにWindowsの標準pingコマンドで音を鳴らすことはできませんが、Linux環境なら標準のpingコマンドに-aオプションを付けることでビープ音を鳴らすことは可能です。
ネットワークエンジニア等、一部の技術者しか使わないニッチなツールです。

機能

以下の機能を有しています。

  • Powershellが動作するWindows端末で動作します。

  • 設定した複数のipアドレスに対して定期的にPing(icmpパケット)を送信します。

  • Powershellのコンソール上に疎通失敗なら赤文字で表示します。

  • 疎通を失敗するとビープ音でお知らせします。

  • 引数に閾値を設定すると応答時間が閾値を上回った際にもビープ音でお知らせします。

  • ログをファイルで記録します。

  • PowerShellのスクリプトのため、お客様環境の「フリーソフトは導入禁止」ポリシーを回避できます。


成功表示と失敗表示

スクリプト

以下のスクリプトをテキストエディタに張り付けて保存してください。拡張子はps1です。

# コマンドライン引数を処理
if ($args.Count -eq 0) {
    # 引数が指定されていない場合のデフォルトIPリスト
    $ipList = "8.8.8.8,8.8.4.4"
    $threshold = $null  # 閾値なし(音を鳴らさない)
} elseif ($args.Count -eq 1) {
    # 引数がIPリストのみ指定された場合
    $ipList = $args[0]
    $threshold = $null  # 閾値なし(音を鳴らさない)
} elseif ($args.Count -eq 2) {
    # 引数にIPリストと閾値が指定された場合
    $ipList = $args[0]
    $threshold = [int]$args[1] # 閾値を設定
} else {
    Write-Host "Usage: script.ps1 <ipList> <optional: responseTimeThreshold>"
    exit
}

# IPアドレスリストをカンマで分割してトリム(余分なスペースを除去)
$ipAddresses = $ipList -split ',' | ForEach-Object { $_.Trim() }

# 監視間隔(秒)
$interval = 1

# ログファイル名に日付を付ける関数
function Get-LogFilePath {
    $date = Get-Date -Format "yyyy-MM-dd"
    $logFile = ".\ping_log_$date.txt" # ログファイルの保存場所を適宜変更
    return $logFile
}

# Pingが失敗した場合に音を鳴らす関数
function Play-AlertSound {
    [console]::beep(1000, 500)
}

# ログを残す関数
function Log-Message {
    param (
        [string]$message
    )
    # 現在時刻を取得してメッセージと共にログに書き込み
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logEntry = "$timestamp - $message"
    $logFile = Get-LogFilePath
    Add-Content -Path $logFile -Value $logEntry
    return $logEntry # 表示用に返す
}

# 応答時間に応じて色を決定する関数
function Get-Color {
    param (
        [int]$responseTime
    )
    if ($responseTime -le 10) {
        return "White"
    } elseif ($responseTime -le 30) {
        return "Cyan"
    } elseif ($responseTime -le 50) {
        return "Green"
    } elseif ($responseTime -le 100) {
        return "Yellow"
    } else {
        return "Red"
    }
}

# メインのループ
while ($true) {
    foreach ($ip in $ipAddresses) {
        try {
            # Test-Connection に ErrorAction を追加してエラーをキャッチ可能にする
            $pingResults = Test-Connection -ComputerName $ip -Count 1 -ErrorAction Stop

            if (-not $pingResults) {
                # Ping失敗時のメッセージ(赤色)
                $logEntry = Log-Message "Ping failed: $ip"
                Write-Host $logEntry -ForegroundColor Red
                Play-AlertSound
            } else {
                # Ping成功時のメッセージ
                $time = $pingResults.ResponseTime
                $ttl = $pingResults.TimeToLive
                $color = Get-Color -responseTime $time
                $logEntry = Log-Message "Ping succeeded: $ip, time=$time ms, TTL=$ttl"
                Write-Host $logEntry -ForegroundColor $color

                # 閾値が設定されている場合、かつ応答時間が閾値を上回る場合にビープ音を鳴らす
                if ($threshold -ne $null -and $time -gt $threshold) {
                    Play-AlertSound
                }
            }
        } catch {
            # エラー発生時の処理
            $logEntry = Log-Message "Error: Unable to ping $ip"
            Write-Host $logEntry -ForegroundColor Red
            Play-AlertSound
        }
    }
    Start-Sleep -Seconds $interval
}

使用手順

ps1を分かりやすいファイルにし、わかりやすい場所に置きます。
ここでは例として「C:\temp」フォルダに「bping.ps1」のファイル名で配置します。

Powershellを起動します。

以下のコマンドを入力してスクリプトが実行できるようにポリシーを変更します。

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

カレントをスクリプトの設置フォルダに移動します。(以下はスクリプト設置場所をc:\tempにした際の例)

cd c:\temp

スクリプトを実行します。(以下はスクリプト名をbping.ps1にした際の例)
引数を付与しない場合はスクリプト4行目で指定されているIPアドレスにpingが送信されます。

.\bping.ps1

実行が成功すると以下のように表示されます。ログもスクリプトフォルダに出力されます。

停止する際は際は「Ctl+C」キーを押してください。

引数に送信先を設定してpingを送信

スクリプトの引数を送信先アドレスを設定することでスクリプトを編集しなくても実行毎に宛先を変更することが可能です。引数のアドレスはカンマ区切りで複数指定します。名前解決が行える場合は名前の指定も可能です。
以下は引数を付与した場合の実行例です。

.\bping.ps1 8.8.8.8,google.com

実行が成功すると以下のように表示されます。

引数に送信先と閾値を設定してpingを送信

送信先アドレスに加えて閾値を設定することで応答時間(ms)が閾値を超えた際にビープ音を鳴らすことが可能です。
以下は引数に閾値1「10」(ms)を付与した場合の実行例です。

.\bping.ps1 8.8.8.8,google.com 10

実行が成功すると閾値を超えた際にビープ音が鳴ります。

いいなと思ったら応援しよう!