代码之家  ›  专栏  ›  技术社区  ›  kprobst

在PowerShell中终止脚本

  •  327
  • kprobst  · 技术社区  · 15 年前

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

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

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

    是的,只是 exit

    10 回复  |  直到 10 年前
        1
  •  448
  •   StackzOfZtuff    9 年前

    你应该使用 the exit keyword .

        2
  •  665
  •   New Guy    9 年前

    我意识到这是一篇老文章,但我发现自己经常回到这篇文章,因为它是搜索这个主题时最热门的搜索结果之一。然而,当我来的时候,由于信息冲突,我总是离开时更加困惑。最终,我总是要进行自己的测试来找出答案。所以这次我将发布我的发现。

    TL;博士 Exit 终止正在运行的脚本。但是,如果您的脚本只是声明稍后将在shell中使用的函数,那么您将希望使用 Return

    退出vs返回vs中断

    • 出口: 这将“退出”当前运行的上下文。如果从脚本调用此命令,它将退出脚本。如果从shell调用此命令,它将退出shell。

      如果函数调用Exit命令,它将退出它所运行的上下文。因此,如果只从正在运行的脚本中调用该函数,它将退出该脚本。但是,如果您的脚本只是声明函数以便可以从当前shell使用它,并且您从shell运行该函数,那么它将退出shell,因为shell是包含 出口

      默认情况下,如果右键单击脚本以在PowerShell中运行它,则一旦脚本运行完毕,PowerShell将自动关闭。这与天气无关 出口

    • 返回: 这将返回到上一个调用点。如果从脚本(在任何函数之外)调用此命令,它将返回shell。如果从shell调用此命令,它将返回shell(这是从shell运行的单个命令的上一个调用点)。如果从函数调用此命令,它将返回调用该函数的位置。

      在返回到的调用点之后,将从该点继续执行任何命令。如果从shell调用脚本,并且该脚本包含 返回 命令在任何函数之外,然后当它返回到shell时,就没有更多的命令可以运行了,因此产生了一个错误 返回 以这种方式使用,基本上与 出口 .

    • 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
      }
      
        3
  •  88
  •   Peter Mortensen icecrime    10 年前

    Exit 也将退出PowerShell。如果您希望“中断”当前函数或脚本,请使用 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..."
    }
    
        4
  •  58
  •   Community CDub    5 年前

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

    错误将在错误流中发送到待处理的主机程序 与输出一起显示。

    非终止错误将错误写入错误流,但 在输入项集合中的一个项上声明 继续处理集合中的其他项。

    终止错误,请使用Throw关键字。有关详细信息,请参阅 关于掷骰子( http://go.microsoft.com/fwlink/?LinkID=145153

        5
  •  36
  •   gabriwinter    10 年前

    终止此进程并向基础操作系统提供指定的退出代码。

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

    [Environment]::Exit(1)

    这将允许您使用特定的退出代码退出,该代码可以从调用方获取。

        6
  •  27
  •   Rob    12 年前

    Return 而不是 Break . Break通常用于循环,并且仅用于从最内层代码块中断。使用Return退出函数或脚本。

        7
  •  27
  •   Peter Mortensen icecrime    10 年前

    throw "Error Message"
    

        8
  •  14
  •   fpschultze    15 年前

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

    Get-Help about_trap
    

    以了解有关陷阱语句的更多信息。

        9
  •  14
  •   iRon    8 年前

    我碰巧发现 Break <UnknownLabel> (例如,简单地 Break Script , Script
    通过这种方式,您可以创建一个函数,该函数在不知道当前范围(以及创建标签)的情况下从任何地方中断脚本(例如,递归循环):

    Function Quit($Text) {
        Write-Host "Quiting because: " $Text
        Break Script
    } 
    
        10
  •  5
  •   Michael Meli    9 年前

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

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

    推荐文章