是否可以只为 catch 块创建一个函数?
Is it possible to create a function only for a catch block?
我有多个 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
requires a literal { ... }
block to follow it, but from inside that block you're free to call reusable code, such as a function, or, in the simplest case, a script block:
# 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
}
注意:.
,dot-sourcing operator,用于在当前作用域中直接调用脚本块,允许您直接修改该作用域的变量。这使得脚本块的行为就像直接用作 catch
black.
相反,如果您想在 子 scope, use &
, the call operator 中执行脚本块。
您可以创建一个 ScriptBlock,它可以使用 Invocation (call - &) Operator.
调用
$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 设置为停止,或者将 -ErrorAction "Stop"
添加到 Invoke-Command
以确保抛出终止错误。
- 最佳做法是将
$ErrorActionPreference
设置回 "Continue"
(如果使用)。
- 我还相信您希望使用
-f
(format) 运算符。
我有多个 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
requires a literal { ... }
block to follow it, but from inside that block you're free to call reusable code, such as a function, or, in the simplest case, a script block:
# 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
}
注意:.
,dot-sourcing operator,用于在当前作用域中直接调用脚本块,允许您直接修改该作用域的变量。这使得脚本块的行为就像直接用作 catch
black.
相反,如果您想在 子 scope, use &
, the call operator 中执行脚本块。
您可以创建一个 ScriptBlock,它可以使用 Invocation (call - &) Operator.
调用$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 设置为停止,或者将 -ErrorAction "Stop"
添加到 Invoke-Command
以确保抛出终止错误。
- 最佳做法是将
$ErrorActionPreference
设置回"Continue"
(如果使用)。 - 我还相信您希望使用
-f
(format) 运算符。