發佈日期:

網路斷線自動排查 支援多目標 IP 與品質評估的 PowerShell 腳本

Views: 0

在日常的企業 IT 運維中,網路資訊的穩定度往往決定了企業內部系統與日常辦公的運作效率。身為專業的資訊服務夥伴,忠碁科技經常收到客戶詢問:當網路出現間歇性斷線或異常卡頓時,該如何第一時間精準抓出是哪一台設備或哪條外網線路出了問題?

為了協助客戶能夠自主且快速地進行網路健檢與故障排障,展現資訊管理的專業度,忠碁特別分享一款企業級的 PowerShell 即時網路品質監測腳本。這款腳本能同時監控多個重要節點(如外部 DNS、內部網閘道器、核心交換機等),不僅能在畫面上以高規格工整排版即時輸出數據,還能自動將斷線狀況精簡記錄成文字檔,非常適合作為企業長期掛網排查或 IT 品質稽核的工具。

為什麼用 PowerShell 網路監測腳本?

相較於傳統 CMD 檔案(Batch)容易受到 Windows 系統語系干擾,且無法精準獲取網路數據,忠碁科技工程師推薦改用微軟核心的 PowerShell(.ps1)環境,並呼叫底層的 .NET 網路元件進行 PING 檢測。這款優化後的腳本具備以下五大核心優勢:

  • 多目標 IP 同時輪詢:可自行設定多個測試目標,各 IP 擁有獨立計數與狀態,互不干擾。
  • 高強迫症工整排版:畫面採用欄位固定寬度格式化對齊,毫秒數個十百位垂直成直線,閱讀極度舒適。
  • 防誤判緩衝機制:必須連續 2 次 PING 失敗才觸發斷線紀錄,完美排除網卡剛啟動或偶爾掉 1 包的誤報。
  • 精簡 Log 自動換檔:每天自動依「月-日_IP.txt」換檔。持續斷線時若原因相同會省略重複寫入,保護硬碟空間。
  • 微秒級別精準轉換:針對內網極速回應環境,自動將 0ms 轉換顯示為更能客觀呈現品質的 <1ms。

PowerShell 網路即時監測腳本程式碼

以下為完整的技術教學程式碼。貴公司的 IT 人員或管理工程師可以直接複製下方內容,並將其另存為 ping_monitor.ps1 檔案即可投入使用。若在部署過程中遇到任何網路規劃或資訊架構的疑問,歡迎隨時聯絡忠碁科技提供技術支援。

# ==================== 自訂設定區 ====================
# 填入您想要測試的多個 IP(用逗號隔開)
$TargetIPs = @("168.95.1.1", "192.168.6.1", "192.168.6.250") 
$IntervalSeconds = 2
# ====================================================

# 初始化每個 IP 的狀態與計數
$IpStates = @{}
$FailCounts = @{}
$LastErrorMessages = @{}

foreach ($ip in $TargetIPs) {
    $IpStates[$ip] = "online"
    $FailCounts[$ip] = 0
    $LastErrorMessages[$ip] = ""
}

# 建立 .NET Ping 物件
$PingProvider = New-Object System.Net.NetworkInformation.Ping

cls
Write-Host "=========================================================================" -ForegroundColor Cyan
Write-Host "【多目標群組 - 網路即時監測與連線品質評估】" -ForegroundColor Cyan
Write-Host "測試目標清單: `$($TargetIPs -join ', ')" -ForegroundColor Cyan
Write-Host "檢測間隔    : 每 `$IntervalSeconds 秒輪詢一次 | 超時設定: 1500ms" -ForegroundColor Cyan
Write-Host "=========================================================================" -ForegroundColor Cyan

while (`$true) {
    `$DateStr = Get-Date -Format "MM-dd"
    `$TimeStr = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

    foreach (`$TargetIP in `$TargetIPs) {
        `$LogFile = "`${DateStr}_`${TargetIP}.txt"

        # 如果 Log 檔案不存在,寫入標頭
        if (-not (Test-Path -Path `$LogFile)) {
            `$HeaderContent = @"
======================================================================
【網路斷線監測與品質紀錄】
======================================================================
測試目標 IP  : `$TargetIP
測試目的     : 檢驗本地端連往目標主機之穩定度與品質
品質判定標準 :
  - 極佳     : 延遲 <= 10ms
  - 良好     : 延遲 11ms - 29ms
  - 普通/稍慢 : 延遲 30ms - 50ms
  - 嚴重延遲 : 延遲 >= 51ms
  - 斷線     : 連續 2 次 PING 失敗(單次超時 1500ms)觸發紀錄
開始記錄時間 : `$TimeStr
======================================================================

"@
            `$HeaderContent | Out-File -FilePath `$LogFile -Encoding utf8
            Write-Host "[`$TimeStr] [系統提示] 已建立 `$TargetIP 專屬紀錄檔: `$LogFile" -ForegroundColor Magenta
        }

        # 執行 PING 檢測
        `$PingResult = `$null
        `$IsSuccess = `$false
        
        try {
            `$PingResult = `$PingProvider.Send(`$TargetIP, 1500)
            if (`$PingResult.Status -eq "Success") { `$IsSuccess = `$true }
        } catch {
            `$ExceptionMessage = `$_.Exception.Message
        }

        # 判斷 PING 結果與格式化排版
        if (`$IsSuccess) {
            `$RoundtripTime = `$PingResult.RoundtripTime
            `$TTL = `$PingResult.Options.Ttl
            
            # 品質評估邏輯
            if (`$RoundtripTime -le 10) { `$QualityText = "極佳" }
            elseif (`$RoundtripTime -le 29) { `$QualityText = "良好" }
            elseif (`$RoundtripTime -le 50) { `$QualityText = "普通/稍慢" }
            else { `$QualityText = "嚴重延遲" }

            # 當時間為 0ms 時,轉換文字為 <1ms,其餘保持原樣並靠右對齊
            `$TimeDisplay = if (`$RoundtripTime -eq 0) { "<1ms" } else { "`$RoundtripTime`ms" }

            # 黃金排版:成功(時間欄位固定固定 5 個字元寬度,確保 <1ms 與 100ms 完美對齊)
            `$ScreenMessage = "[{0}]  {1,-15} | 成功 | 時間={2,5} | TTL={3,3} | 品質: {4}" -f `$TimeStr, `$TargetIP, `$TimeDisplay, `$TTL, `$QualityText
            Write-Host `$ScreenMessage -ForegroundColor White

            # 狀態恢復判定
            if (`$IpStates[`$TargetIP] -eq "offline") {
                `$LogContent = @"
========================================
[恢復時間] `$TimeStr 連線已恢復正常! (當前回應時間: `$TimeDisplay)
========================================

"@
                `$LogContent | Out-File -FilePath `$LogFile -Append -Encoding utf8
                `$LogNotice = "[{0}]  {1,-15} | [LOG提示] 網路已恢復連線!已更新 {2}" -f `$TimeStr, `$TargetIP, `$LogFile
                Write-Host `$LogNotice -ForegroundColor Cyan
            }

            `$FailCounts[`$TargetIP] = 0
            `$IpStates[`$TargetIP] = "online"
            `$LastErrorMessages[`$TargetIP] = ""
        }
        else {
            `$FailCounts[`$TargetIP]++
            `$QualityText = "斷線"

            `$CurrentErrorMessage = ""
            if (`$null -ne `$PingResult) {
                `$CurrentErrorMessage = `$PingResult.Status.ToString()
            } else {
                `$CurrentErrorMessage = if (`$ExceptionMessage) { `$ExceptionMessage } else { "Unknown Network Error / Timeout" }
            }

            # 黃金排版:失敗(補齊長度,與上方成功欄位完美契合)
            `$ScreenMessage = "[{0}]  {1,-15} | 失敗 | 原因={2,-22} | 次數: {3,2} | 品質: {4}" -f `$TimeStr, `$TargetIP, `$CurrentErrorMessage, `$FailCounts[`$TargetIP], `$QualityText
            Write-Host `$ScreenMessage -ForegroundColor Red

            # 連續 2 次失敗觸發 Log 寫入
            if (`$FailCounts[`$TargetIP] -ge 2) {
                `$IpStates[`$TargetIP] = "offline"

                if (`$CurrentErrorMessage -ne `$LastErrorMessages[`$TargetIP]) {
                    `$LogContent = @"
========================================
[斷線時間] `$TimeStr (連續第 `$(`$FailCounts[`$TargetIP]) 次失敗)
[詳細錯誤訊息]
`$CurrentErrorMessage
[品質評估] 網路中斷 (斷線)
========================================

"@
                    `$LogContent | Out-File -FilePath `$LogFile -Append -Encoding utf8
                    `$LogNotice = "[{0}]  {1,-15} | [LOG提示] 失敗原因改變或首次斷線,已更新至 {2}" -f `$TimeStr, `$TargetIP, `$LogFile
                    Write-Host `$LogNotice -ForegroundColor DarkRed
                    
                    `$LastErrorMessages[`$TargetIP] = `$CurrentErrorMessage
                }
            }
        }
    }

    # 等待 2 秒重複執行
    Start-Sleep -Seconds `$IntervalSeconds
}

如何執行此指令檔教學

為了確保腳本順利運作,請遵循以下由忠碁科技提供的標準操作步驟:

  1. 在電腦桌面上點擊右鍵,新建一個純文字檔案,並將其重新命名為 ping_monitor.ps1(請務必確認副檔名從 .txt 變更為 .ps1)。
  2. 使用PS編輯器打開該檔案,將上方提供的程式碼完整複製並貼入,儲存後關閉。
  3. 由於 Windows 預設的安全性原則會阻止未簽署的腳本執行,請在 Windows 開始選單搜尋「PowerShell」,並以系統管理員身分執行開啟它。
  4. 在 PowerShell 視窗中輸入以下命令以解除權限限制,並輸入 Y 答應變更:
    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
  5. 最後,直接將檔案拖曳進 PowerShell 視窗中按 Enter,或輸入檔案路徑即可開始執行監測。

結語:專業的資訊維護,交給最具實力的團隊

透過這款工具,企業的網路管理人員能夠在不用採購昂貴監控軟體的前提下,達到精準掌握多個主機與節點連線品質的目的。

網路環境的穩定度是企業數位轉型的基石。如果您所在的企業正面臨複雜的網路架構異常、嚴重的跨區斷線、或是需要全方位的資訊委外維護與資安規劃,忠碁科技隨時準備好為您量身打造最高效、最穩健的企業級維運方案。歡迎與我們聯繫!

📍 遺珠推薦 (很多人錯過了這篇...):
Hello world! 哈囉!

免責聲明】 AI-Assisted Content | 部分資料引用自網路、AI的文筆,以及作者的整理。
如有侵權、雷同或標註錯誤,敬請來信明告知,還原始末釐前因。一經確認即撤稿,守護清名謝君勉。

請認明】🔗 chungg.com 才是官方唯一授權認證網域。

專業領航|知識技術無價  價值實踐|應用服務有價

本頁連結(239436):網路斷線自動排查 支援多目標 IP 與品質評估的 PowerShell 腳本