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 錯誤 - 輸出 1

在 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 命令。該命令負責在控制台上顯示消息。

輸出:

抑制 PowerShell 錯誤 - 輸出 2

我們可以為 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 錯誤 - 輸出 3

結論

隨著我們結束了對 PowerShell 中錯誤處理不同方面的探索,顯而易見的是,這種腳本語言的力量在於其靈活性和深度。從 -ErrorAction 參數的簡單性到 Try-Catch 語句提供的微妙控制,PowerShell 提供了一個豐富的工具包,用於在各種情境中管理錯誤。

了解這些工具並知道何時應用它們對編寫健壯、具有韌性的腳本至關重要。我們探討了壓制錯誤在不同情境下既是福音又是風險的情況,並考察了如何捕獲錯誤以供後續分析。

到現在為止,您應該已對這些方法有了全面的了解,並能夠在您的腳本編寫工作中有效應用它們。