阿仁's Blog

在 PowerShell 中使用 Error Handling

| Comments

正常我們會使用一些腳本程式,來協助執行一些日常自動化的作業。
例如我們常用的 Linux Shell Script 搭配 Crontab。
Windows Server PowerShell 搭配 Task Scheduler 等等。

但是!你的自動化 PowerShell Script 有做 Error Handling 嗎?

其實 PowerShell 中有支援 try catch 的語法。
來,直接看 Demo Code。

$ErrorActionPreference = "Stop"
$bak_filenameA = "D:\test\test.txt"
$bak_filenameB = "D:\test\testB.txt"

try {

    #delete file if not exists

    Remove-Item $bak_filenameA -ErrorAction Stop
    Remove-Item $bak_filenameB 
    
} catch {
    $formatstring = "{0} : {1}`n{2}`n" +
                    "    + CategoryInfo        : {3}`n" +
                    "    + FullyQualifiedErrorId : {4}`n"
    $fields = $_.InvocationInfo.MyCommand.Name,
              $_.Exception.Message,
              $_.InvocationInfo.PositionMessage,
              $_.CategoryInfo.ToString(),
              $_.FullyQualifiedErrorId

    $ErrorMessage = $formatstring -f $fields
    Write-Host -Foreground Red ($ErrorMessage)
}

幾個須注意的地方。
第一行所給定的變數 $ErrorActionPreference = "Stop"
意思是,針對後面的程式碼,預設的 ErrorAction 參數皆為 Stop。
(原先系統預設的參數是 $ErrorActionPreference = Continue)

這是甚麼意思?
意思是,如果沒有下這一行指令的話,
在 Try Catch Block 中,你都必須要像刪除檔案A的指令一樣,
在後面個別去設定對應的 -ErrorAction 參數。
Remove-Item $bak_filenameA -ErrorAction Stop

至於後面 Catch 到 Exception 之後,
再從 PS 的內建變數元件 $_ 裡面去抓到對應的參數即可。

Reference

https://blog.kloud.com.au/2016/07/24/effective-error-hanalding-in-powershell-scripting/
https://stackoverflow.com/questions/38419325/catching-full-exception-message
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-6
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_try_catch_finally?view=powershell-6

Comments

comments powered by Disqus