【发布时间】:2018-01-26 13:06:47
【问题描述】:
我正在调用一个外部 .ps1 文件,该文件在某些错误条件下包含 break 语句。我想以某种方式捕捉这种情况,允许任何外部打印的消息正常显示,并继续我的脚本中的后续语句。如果外部脚本有throw,则使用try/catch 可以正常工作。即使在我的文件中有trap,我也无法阻止我的脚本终止。
为了回答这个问题,假设外部 .ps1 文件的源代码(由其他人创作并在运行时引入)无法更改。
我想要的是否可能,或者脚本的作者只是不想在外部调用时表现得很好?
编辑:提供以下示例。
在 badscript.ps1 中:
if((Get-Date).DayOfWeek -ne "Yesterday"){
Write-Warning "Sorry, you can only run this script yesterday."
break
}
在 myscript.ps1 中:
.\badscript.ps1
Write-Host "It is today."
我想要达到的结果是看到来自 badscript.ps1 的警告,并让它继续我在 myscript.ps1 中的进一步声明。我理解为什么 break 语句会导致“It is today”。永远不会被打印,但是我想找到解决方法,因为我不是 badscript.ps1 的作者。
编辑:将标题从“powershell try/catch 不捕获中断语句”更新为“如何防止外部脚本使用中断语句终止脚本”。提到 try/catch 实际上更多的是新标题更好地反映了实际问题的一个失败的解决方案。
【问题讨论】:
-
break不会触发错误,不会。如果break语句仅在脚本中抛出错误的条件下被调用,您可以设置$ErrorActionPreference = 'Stop' -
try和catch用于例外情况,throw也是如此。break与此无关。你的问题没有意义/ -
@EJP 这个问题的重点是是否有一种机制可以让我获得类似的结果来捕获异常。对我来说很有意义:如何获得外部脚本调用而不停止脚本的执行?
-
@MathiasR.Jessen 不幸的是,一些 break 语句是在非错误条件语句之后使用的,所以也许我在称它们为“错误条件”时不够精确。此外,我不希望全局强制所有其他脚本非终止错误成为终止错误,因为它可以优雅地处理一些错误。
-
如果您包含一些您现在拥有的示例,这个问题可能会更有意义,这样我们就可以看到您正在尝试解决的问题。这个问题似乎不清楚,cmets 正试图澄清这一点。见minimal reproducible example
标签: powershell