首页 文章

在PowerShell中终止脚本

提问于
浏览
306

我一直在寻找一种在函数内发生不可恢复的错误时终止PowerShell(PS1)脚本的方法 . 例如:

function foo() {
    # Do stuff that causes an error
    $host.Exit()
}

当然没有 $host.Exit() 这样的东西 . 有 $host.SetShouldExit() ,但这实际上关闭了控制台窗口,这不是我想要的 . 我需要的是相当于Python的 sys.exit() 的东西,它将简单地停止执行当前脚本而不需要进一步的执行 .

Edit: 是的,它只是 exit . 咄 .

10 回答

  • 2

    也许最好使用“陷阱” . PowerShell陷阱指定在发生终止或错误时运行的代码块 . 类型

    Get-Help about_trap
    

    了解陷阱声明的更多信息 .

  • 40

    你应该使用the exit keyword .

  • 21

    Write-Error用于非终止错误,throw用于终止错误

    Write-Error cmdlet声明了一个非终止错误 . 默认情况下,错误将在错误流中发送到要显示的主机程序以及输出 . 非终止错误会向错误流写入错误,但它们不会停止命令处理 . 如果在输入项集合中的一个项上声明了非终止错误,则该命令将继续处理集合中的其他项 . 要声明终止错误,请使用Throw关键字 . 有关详细信息,请参阅about_Throw(http://go.microsoft.com/fwlink/?LinkID=145153) .

  • 315

    抛出异常会很好,尤其是如果您想澄清错误原因:

    throw "Error Message"
    

    这将产生终止错误 .

  • 20

    终止此过程并为底层操作系统提供指定的退出代码 .

    https://msdn.microsoft.com/en-us/library/system.environment.exit%28v=vs.110%29.aspx

    [Environment]::Exit(1)

    这将允许您退出特定的退出代码,该代码可以从调用者处获取 .

  • 1

    我用它来重新运行一个程序 . 我不知道它是否会有所帮助,但它是一个简单的if语句,只需要两个不同的条目 . 它在powershell中为我工作 .

    $rerun = Read-Host "Rerun report (y/n)?"
    
    if($rerun -eq "y") { Show-MemoryReport }
    if($rerun -eq "n") { Exit }
    

    不知道这是否有帮助,但我相信这会在你运行它之后终止一个程序 . 但是,在这种情况下,每个定义的输入都需要列出和分类的输出 . 你也可以让退出调用一个新的提示行并以这种方式终止程序 .

  • 478

    我巧合地发现 Break <UnknownLabel> (例如,简单的 Break Script ,其中标签 Script 不存在)似乎突破了整个脚本(即使是在函数内)并使主机保持活动状态 .
    这样你就可以创建一个在不知道当前范围(和创建标签)的情况下从任何地方(例如递归循环)中断脚本的函数:

    Function Quit($Text) {
        Write-Host "Quiting because: " $Text
        Break Script
    }
    
  • 72

    我意识到这是一个很老的帖子,但我发现自己回到这个帖子很多,因为它是搜索这个主题时的顶级搜索结果之一 . 然而,由于信息冲突,我总是更加困惑 . 最终,我总是要进行自己的测试来弄明白 . 所以这次我会发布我的发现 .

    TL;DR 大多数人都希望使用 Exit 来终止正在运行的脚本 . 但是,如果您的脚本仅仅声明稍后在shell中使用的函数,那么您将需要在所述函数的定义中使用 Return .

    退出vs返回vs休息

    • Exit: 这将"exit"当前正在运行的上下文 . 如果从脚本调用此命令,它将退出脚本 . 如果从shell调用此命令,它将退出shell .

    如果函数调用Exit命令,它将退出它正在运行的任何上下文 . 因此,如果仅从正在运行的脚本中调用该函数,它将退出该脚本 . 但是,如果您的脚本只是声明了该函数,以便可以从当前shell使用它并从shell运行该函数,它将退出shell,因为shell是运行 Exit 命令的函数正在运行的上下文 .

    Note: 默认情况下,如果右键单击脚本在PowerShell中运行脚本,则一旦脚本运行完毕,PowerShell将自动关闭 . 这与 Exit 命令或脚本中的任何其他内容无关 . 对于使用此特定运行脚本的方法运行的脚本,它只是一个默认的PowerShell行为 . 批处理文件和命令行窗口也是如此 .

    • Return: 这将返回上一个呼叫点 . 如果从脚本(任何函数外部)调用此命令,它将返回到shell . 如果从shell调用此命令,它将返回到shell(这是从shell运行的单个命令的先前调用点) . 如果从函数调用此命令,它将返回到调用函数的位置 .

    在返回的调用点之后执行任何命令将从该点继续 . 如果从shell调用脚本并且它在任何函数外部包含 Return 命令,那么当它返回到shell时,没有更多的命令可以运行,因此 Return 以这种方式使用与 Exit 基本相同 .

    • Break: 这将打破循环和切换案例 . 如果在不在循环或切换的情况下调用此命令,它将突破脚本 . 如果在嵌套在循环内的循环内调用 Break ,它将只会突破它所调用的循环 .

    Break 还有一个有趣的特性,你可以在其中为一个带有标签的循环添加前缀,然后即使在该标记循环内的几个嵌套组中调用 Break 命令,也可以打破该标记循环 .

    While ($true) {
        # Code here will run
    
        :myLabel While ($true) {
            # Code here will run
    
            While ($true) {
                # Code here will run
    
                While ($true) {
                    # Code here will run
                    Break myLabel
                    # Code here will not run
                }
    
                # Code here will not run
            }
    
            # Code here will not run
        }
    
        # Code here will run
    }
    
  • 17

    我认为你正在寻找 Return 而不是 Break . Break通常用于循环,只从最里面的代码块中断 . 使用Return退出函数或脚本 .

  • 10

    Exit 也将退出PowerShell . 如果你希望"break"只是当前的函数或脚本 - 使用 Break :)

    If ($Breakout -eq $true)
    {
         Write-Host "Break Out!"
         Break
    }
    ElseIf ($Breakout -eq $false)
    {
         Write-Host "No Breakout for you!"
    }
    Else
    {
        Write-Host "Breakout wasn't defined..."
    }
    

相关问题