我一直在寻找一种在函数内发生不可恢复的错误时终止PowerShell(PS1)脚本的方法 . 例如:
function foo() {
# Do stuff that causes an error
$host.Exit()
}
当然没有 $host.Exit()
这样的东西 . 有 $host.SetShouldExit()
,但这实际上关闭了控制台窗口,这不是我想要的 . 我需要的是相当于Python的 sys.exit()
的东西,它将简单地停止执行当前脚本而不需要进一步的执行 .
Edit: 是的,它只是 exit
. 咄 .
10 回答
也许最好使用“陷阱” . PowerShell陷阱指定在发生终止或错误时运行的代码块 . 类型
了解陷阱声明的更多信息 .
你应该使用the exit keyword .
Write-Error用于非终止错误,throw用于终止错误
抛出异常会很好,尤其是如果您想澄清错误原因:
这将产生终止错误 .
终止此过程并为底层操作系统提供指定的退出代码 .
https://msdn.microsoft.com/en-us/library/system.environment.exit%28v=vs.110%29.aspx
[Environment]::Exit(1)
这将允许您退出特定的退出代码,该代码可以从调用者处获取 .
我用它来重新运行一个程序 . 我不知道它是否会有所帮助,但它是一个简单的if语句,只需要两个不同的条目 . 它在powershell中为我工作 .
不知道这是否有帮助,但我相信这会在你运行它之后终止一个程序 . 但是,在这种情况下,每个定义的输入都需要列出和分类的输出 . 你也可以让退出调用一个新的提示行并以这种方式终止程序 .
我巧合地发现
Break <UnknownLabel>
(例如,简单的Break Script
,其中标签Script
不存在)似乎突破了整个脚本(即使是在函数内)并使主机保持活动状态 .这样你就可以创建一个在不知道当前范围(和创建标签)的情况下从任何地方(例如递归循环)中断脚本的函数:
我意识到这是一个很老的帖子,但我发现自己回到这个帖子很多,因为它是搜索这个主题时的顶级搜索结果之一 . 然而,由于信息冲突,我总是更加困惑 . 最终,我总是要进行自己的测试来弄明白 . 所以这次我会发布我的发现 .
TL;DR 大多数人都希望使用
Exit
来终止正在运行的脚本 . 但是,如果您的脚本仅仅声明稍后在shell中使用的函数,那么您将需要在所述函数的定义中使用Return
.退出vs返回vs休息
如果函数调用Exit命令,它将退出它正在运行的任何上下文 . 因此,如果仅从正在运行的脚本中调用该函数,它将退出该脚本 . 但是,如果您的脚本只是声明了该函数,以便可以从当前shell使用它并从shell运行该函数,它将退出shell,因为shell是运行
Exit
命令的函数正在运行的上下文 .Note: 默认情况下,如果右键单击脚本在PowerShell中运行脚本,则一旦脚本运行完毕,PowerShell将自动关闭 . 这与
Exit
命令或脚本中的任何其他内容无关 . 对于使用此特定运行脚本的方法运行的脚本,它只是一个默认的PowerShell行为 . 批处理文件和命令行窗口也是如此 .在返回的调用点之后执行任何命令将从该点继续 . 如果从shell调用脚本并且它在任何函数外部包含
Return
命令,那么当它返回到shell时,没有更多的命令可以运行,因此Return
以这种方式使用与Exit
基本相同 .Break
,它将只会突破它所调用的循环 .Break
还有一个有趣的特性,你可以在其中为一个带有标签的循环添加前缀,然后即使在该标记循环内的几个嵌套组中调用Break
命令,也可以打破该标记循环 .我认为你正在寻找
Return
而不是Break
. Break通常用于循环,只从最里面的代码块中断 . 使用Return退出函数或脚本 .Exit
也将退出PowerShell . 如果你希望"break"只是当前的函数或脚本 - 使用Break
:)