HOWTO · PowerShell
如何抑制 PowerShell 錯誤
這篇短文將討論使用 ErrorAction 參數處理和抑制錯誤的多種技術。
本頁內容
這篇文章深入探討了 PowerShell 錯誤處理的複雜世界,探索了各種方法,如 -ErrorAction 參數、設置錯誤行為首選項,以及使用 Try-Catch 語句。這些方法各自有其獨特的目的,從靜默繼續執行腳本到實施複雜的錯誤處理機制。
這種詳細的探索旨在使新手和資深腳本編寫者都能掌握做出有關 PowerShell 腳本錯誤處理的知識,確保他們能有效管理意外情況並維護腳本的完整性。
PowerShell 中錯誤行為的介紹
雖然壓制 Windows PowerShell 錯誤非常簡單,但這樣做並不總是最佳選擇(盡管可以這樣做)。如果我們輕率地告訴 PowerShell 隱藏錯誤,可能會導致我們的腳本表現不可預測。
壓制錯誤信息也使得故障排除和信息收集變得更加複雜。因此請謹慎行事,並仔細使用本文中將看到的以下片段。
在 PowerShell 中使用 -ErrorAction 參數
PowerShell 中的 -ErrorAction 參數旨在決定 cmdlet 如何應對運行時錯誤。默認情況下,PowerShell 會將錯誤顯示到控制台並繼續執行。
然而,在某些情況下,你可能想改變這種行為——例如,隱藏錯誤信息或在發生錯誤時停止執行。這時 -ErrorAction 變得至關重要。
命令:
Get-Service 'svc_not_existing' -ErrorAction SilentlyContinue
Write-Host "This line will execute regardless of the above command's result."
在我們的腳本中,我們試圖檢索一個名為 'svc_not_existing' 的服務,這是一個可能不存在的服務。通過應用 -ErrorAction SilentlyContinue,我們指示 PowerShell 在找不到該服務的情況下繼續執行,而不顯示錯誤信息。
隨後,我們的腳本無縫過渡到 Write-Host 命令。該命令將特定消息輸出到控制台。
輸出:
在 PowerShell 中設置錯誤行為首選項
如果我們需要腳本以某種特定方式運行(例如壓制錯誤),我們可以考慮設置一些首選變數。首選變數作為 PowerShell 的配置設置。
我們可以使用首選變數來控制 PowerShell 保留的歷史項目數量或強制 PowerShell 在執行特定操作之前詢問用戶。
例如,這是你如何使用首選變數將 -ErrorAction 參數設置為 SilentlyContinue 以適用於整個會話。
命令:
$ErrorActionPreference = 'SilentlyContinue'
Get-Service 'nonexistent_service'
Write-Host "This message is displayed even if the previous command fails."
在我們的腳本中,我們首先將 $ErrorActionPreference 設置為 'SilentlyContinue'。這一操作確保該設置應用於我們腳本中的所有後續命令。
因此,任何通常會出現的錯誤都會被有效壓制。
接下來,我們使用 Get-Service cmdlet 嘗試檢索一個不存在的服務。在正常情況下,這將觸發一個錯誤。然而,幸好我們之前設置了 $ErrorActionPreference,任何應該產生的錯誤都未被顯示且不顯眼。
隨後,我們的腳本優雅地移動到 Write-Host 命令。該命令負責在控制台上顯示消息。
輸出:
我們可以為 ErrorAction 開關參數指定許多其他錯誤行為。
Continue:PowerShell 會顯示錯誤信息,但腳本將繼續運行。Ignore:PowerShell 不會生成任何錯誤信息,將任何錯誤輸出寫在主機上,並繼續執行。Stop:PowerShell 會顯示錯誤信息並停止運行腳本。Inquire:PowerShell 顯示錯誤信息,但如果用戶想要繼續,將先要求確認。SilentlyContinue:如果代碼無法正常工作或存在非終止錯誤,PowerShell 會靜默繼續執行代碼。Suspend:PowerShell 暫停腳本的工作流程。
在 PowerShell 中使用 Try-Catch 語句參數
Try-Catch 語句是 PowerShell 中用於以控制和精細的方式管理和響應錯誤的強大工具。它允許腳本編寫者 try 一段代碼塊,並 catch 執行過程中出現的任何異常(錯誤)。
這種方法在希望優雅地處理錯誤、在發生錯誤時執行特定操作或防止錯誤突然結束腳本時非常有用。
命令:
try {
Get-Service 'nonexistent_service'
}
catch {
Write-Host "An error occurred: $_"
}
在這個腳本中,我們首先將可能出錯的命令 Get-Service 'nonexistent_service' 封裝在 try 塊中。我們試圖檢索一個可能不存在的服務,這通常會導致錯誤。
然而,我們並不允許這個錯誤終止腳本或顯示未處理的異常,而是將其捕獲。在 catch 塊中,我們執行 Write-Host 命令以顯示自訂錯誤信息,並包括錯誤詳情($_ 代表當前錯誤對象)。
輸出:
結論
隨著我們結束了對 PowerShell 中錯誤處理不同方面的探索,顯而易見的是,這種腳本語言的力量在於其靈活性和深度。從 -ErrorAction 參數的簡單性到 Try-Catch 語句提供的微妙控制,PowerShell 提供了一個豐富的工具包,用於在各種情境中管理錯誤。
了解這些工具並知道何時應用它們對編寫健壯、具有韌性的腳本至關重要。我們探討了壓制錯誤在不同情境下既是福音又是風險的情況,並考察了如何捕獲錯誤以供後續分析。
到現在為止,您應該已對這些方法有了全面的了解,並能夠在您的腳本編寫工作中有效應用它們。