是否可以只为 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) 运算符。