PowerShell:单点我可以捕获所有异常

时间:2011-02-22 11:35:12

标签: powershell exception-handling

我有几个PowerShell脚本文件。 a.ps1'调用'(通过点运算符)b.ps1c.ps1脚本。

a.ps1    #main
  b.ps1  #helper1 <- need catch error there
  c.ps1  #helper2 <- error is being raised there

b.ps1文件中是否可以捕获c.ps1文件中引发的终止错误?

感谢。

修改

内部a.ps1

. .\b.ps1
. .\c.ps1

内部b.ps1

trap {
  Write-Host "my trap block"
}

内部c.ps1

throw "test"

在此示例中未调用“我的陷阱块”

2 个答案:

答案 0 :(得分:4)

您可以在trap中安装b.ps1处理程序,以处理c.ps1中的错误(如果您点对源b.ps1,以便它与{{1}在同一范围内运行例如:

a.ps1

更新:确实这不起作用。似乎PowerShell并不尊重通过点源采用a.ps1范围运行的概念。不确定你能做的比这更好:

. .\b.ps1

看起来陷阱处理程序需要在a.ps1中,但您可以在b.ps1中定义陷阱处理函数。不过,不要认为你可以控制这个函数中错误的处理(中断或继续)。

答案 1 :(得分:0)

这真的很奇怪。显然,陷阱并不关心范围。

我没有适当的解决方案,但我有一个狡猾的解决方法:

您可以在<:p>中编写 this

.([scriptblock]::create(( (gc .\b.ps1 -del `0) + "`n" + (gc .\c.ps1 -del `0) )))

或者同样的事情,换句话说:

.( [scriptblock]::create(( @(gc .\b.ps1) + @(gc .\c.ps1) -join "`n" )) )