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..."
}