【问题标题】:Emulating -ErrorAction in custom powershell function在自定义 powershell 函数中模拟 -ErrorAction
【发布时间】:2011-08-22 11:41:24
【问题描述】:

如何在自定义 powershell 函数中模拟 -ErrorAction。例如考虑以下脚本

function Foo2
{
  Write-Host "in Foo2"
  #...Error occurs 
  Foo3
}

function Foo1
{
   Write-Host "in Foo1"
   Foo2
}

function Foo3
{
   Write-Host "in Foo3"
}

PS>Foo1 -ErrorAction 停止

是否可以在 Foo2 发生错误时停止 Foo1 的执行,而不是继续执行 Foo3 ?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    get-help about_Functions_CmdletBindingAttribute

    你想要:

    函数 Foo1() { [CmdletBinding()] 参数() 过程{ 写入主机“在 Foo1 中” Foo2 } }

    这不是关于仿真,它意味着真正在你的函数中实现通用参数;如果这是你的意图。


    之后,你可以这样工作:

    Foo1 -ErrorAction 停止

    Foo2Foo3 可以使用相同的语法。


    要记录错误,请照常使用重定向。

    【讨论】:

    • 让我说清楚,就像标准 cmdlet 在基于 ErrorAction 的值发生错误时将如何停止或继续一样,我什至希望 Foo1 的行为完全一样,我也想记录错误。我该怎么做?
    • 如果您使用cmdletbinding,您可以完全免费地做到这一点!查看我的编辑。
    • 小提示,来自嵌套命令的Write-Error 调用或错误将使用它,Write-Host 不会。 :)
    【解决方案2】:

    这是一个示例来说明@Empo 答案

    function Test-ErrorAction
    {
      [CmdletBinding()]
      Param( )
    
      begin 
      {
        Write-Host "I'am Here"    
       }
    
      Process 
      {
        Write-Error "coucou"
      }
      end 
      {
        Write-Host "Done !"
      }
    }
    
    clear
    Test-ErrorAction -ErrorAction "silentlycontinue"
    Test-ErrorAction -ErrorAction "stop"
    

    给予

    I'am Here
    Done !
    I'am Here
    coucou
     à C:\Développements\Pgdvlp_Powershell\Sources partagées\Menus Contextuel Explorer\Test-ErrorAction.ps1: ligne:23 caractère:17
    + Test-ErrorAction  <<<< -ErrorAction "stop"
    

    【讨论】:

    • 注意:同样值得注意的是,ErrorAction 的行为与您期望的一样,您应该使用Write-Error 引发错误。如果你throw异常,ErrorAction/ErrorActionPreference没有影响;根据定义,例外是Stop(终止错误)。 stackoverflow.com/a/9295344/361842
    【解决方案3】:
    function Foo2
    {
     Write-Host "in Foo2"
     Try {something} 
       Catch {
                 Write-host "Foo2 blew up!"
                 return
                 }
     Foo3
     }
    

    【讨论】:

      猜你喜欢
      • 2021-02-22
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多