我有多个try catch
块,并且它们都使用同一个catch
块。
try {
invoke-command -cn $host -Credential $cred -ScriptBlock {
param($name)
statement...
} -ArgumentList $name
} catch {
$formatstring = "{0} : {1}`n{2}`n" +
" + CategoryInfo : {3}`n" +
" + FullyQualifiedErrorId : {4}`n"
write-host ($formatstring)
exit 1
}
...
try {
another statement...
} catch {
$formatstring = "{0} : {1}`n{2}`n" +
" + CategoryInfo : {3}`n" +
" + FullyQualifiedErrorId : {4}`n"
write-host ($formatstring)
exit 1
}
我想问是否可以创建一个具有catch
块的函数,这样我就可以调用和使用该函数,而不是多次写入相同的catch block
。
我正在使用poweshell 5
catch
需要一个literal{ ... }
块来跟随它,但从该块内部的可以自由调用可重用代码,例如函数,或者在最简单的情况下,调用脚本块:
# Define a script block to use in multiple `catch` blocks.
$sb = {
"[$_]" # echo the error message
}
# Two simple sample try / catch statements:
try {
1 / 0
}
catch {
. $sb # `. <script-block>` invokes the block directly in the current scope
}
try {
Get-Item -NoSuchParam
}
catch {
. $sb
}
注意:点源运算符.
用于直接调用当前作用域中的脚本块,允许您直接修改该作用域的变量。这使得脚本块的行为就像直接用作catch
黑色一样。
相反,如果要在子作用域中执行脚本块,请使用调用运算符&
。
您可以创建一个ScriptBlock,该块可以使用Invocation(call-&(运算符调用。
$callMe = {
$formatstring = "{0} : {1}`n{2}`n" +
" + CategoryInfo : {3}`n" +
" + FullyQualifiedErrorId : {4}`n"
Write-Host -Object $formatstring
exit 1
}
try {
Invoke-Command -ComputerName $host -Credential $cred -ScriptBlock {
param($name)
# statement...
} -ArgumentList $name -ErrorAction "Stop"
}
catch {
& $callMe
}
顺便说一句,如果你发现自己在重复代码,你可能可以做些什么。我建议将$ErrorActionPreference设置为停止,或者在Invoke-Command
中添加一个-ErrorAction "Stop"
,以确保抛出终止错误。
- 如果使用,最佳做法是将
$ErrorActionPreference
设置回"Continue"
- 我还认为您希望使用
-f
(格式(运算符