PowerShell 本身有很多很好的錯誤控制,但是習慣於.net編程的人員,更喜歡用Try Catch Finally方法,尤其當有一段代碼必須被執行到的時候。現在好了,adweigert 想出了一個好方法來實現。這個函數已經在多種情況下測試過,希望能對你有幫助。
1
function Try
2 {
3 param
4 (
5 [ScriptBlock] $Command = $( throw " The parameter -Command is required. "),
6 [ScriptBlock] $Catch = { throw $_ },
7 [ScriptBlock] $Finally = {}
8 )
9
10 & {
11 $local:ErrorActionPreference = " SilentlyContinue "
12
13 trap
14 {
15 trap
16 {
17 & {
18 trap { throw $_ }
19 & $Finally
20 }
21
22 throw $_
23 }
24
25 $_ | & { & $Catch }
26 }
27
28 & $Command
29 }
30
31 & {
32 trap { throw $_ }
33 & $Finally
34 }
35 }
2 {
3 param
4 (
5 [ScriptBlock] $Command = $( throw " The parameter -Command is required. "),
6 [ScriptBlock] $Catch = { throw $_ },
7 [ScriptBlock] $Finally = {}
8 )
9
10 & {
11 $local:ErrorActionPreference = " SilentlyContinue "
12
13 trap
14 {
15 trap
16 {
17 & {
18 trap { throw $_ }
19 & $Finally
20 }
21
22 throw $_
23 }
24
25 $_ | & { & $Catch }
26 }
27
28 & $Command
29 }
30
31 & {
32 trap { throw $_ }
33 & $Finally
34 }
35 }
使用示例:
#
Example usage
Try {
echo " ::Do some work... "
echo " ::Try divide by zero: $(0/0) "
} -Catch {
echo " ::Cannot handle the error (will rethrow): $_ "
# throw $_
} - Finally {
echo " ::Cleanup resources... "
}
Try {
echo " ::Do some work... "
echo " ::Try divide by zero: $(0/0) "
} -Catch {
echo " ::Cannot handle the error (will rethrow): $_ "
# throw $_
} - Finally {
echo " ::Cleanup resources... "
}