如何仅在非交互式运行时从Powershell脚本返回退出代码

时间:2010-12-08 19:41:52

标签: powershell

我有很多脚本按计划任务运行。所以他们在任何失败时都会$host.setshouldexit(1),它会在任务调度程序中显示为返回码。

我还希望能够在调试和测试时以交互方式运行这些脚本。所以$host.setshouldexit()会杀死我的powershell或ISE会话。

我的问题是:如何检测脚本是否以非交互方式运行?如果是,那么我将使用setshouldexit,否则它将打印错误代码或非破坏性的东西。 (请注意,我不想使用[environment]::userinteractive,因为这些脚本并不总是在操作系统认为是非交互式会话的情况下运行。)

我正在使用一个非交互式开关来执行计划任务。有什么方法可以从powershell查询吗?

6 个答案:

答案 0 :(得分:7)

$Host.SetShouldExit方法不是必需的,实际上是不一致的,具体取决于您调用脚本的方式。使用关键字exit可以获得退出状态。

使用powershell -F script.ps1

  • exit - 作品
  • SetShouldExit - 忽略

使用powershell -c '.\script.ps1'

  • exit - 状态分别为0或1,表示脚本成功或失败。
  • SetShouldExit - 以正确状态退出,但脚本中的剩余行仍在运行。

使用powershell -c '.\script.ps1; exit $LASTEXITCODE' [1]:

  • exit - 作品
  • SetShouldExit - 退出状态== 0,脚本中的剩余行仍在运行。

直接从powershell(> .\script.ps1)调用:

  • exit - 作品
  • SetShouldExit - 终止以给定退出状态调用powershell主机

答案 1 :(得分:2)

为什么不在测试过程中使用参数“testing”来设置正确的行为?你有一个历史缓冲区,因此几乎不再需要输入。

答案 2 :(得分:2)

我有同样的问题。以下适用于我:

# Exit with Return Code when NOT using PowerShell ISE
if ($psise -eq $Null)
{
    $host.SetShouldExit(1)
}

答案 3 :(得分:2)

在找到您的问题后,我更进一步地发现了问题并找到了$MyInvocation.MyCommand.Name。在命令解释器和ISE命令解释器中都是False。当一个脚本(我的jest.ps1)只包含该行:Write-Host $MyInvocation.MyCommand.Name从cmd.exe调用powershell.exe运行时:

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe  -ExecutionPolicy RemoteSigned -NoExit -NonInteractive -NoProfile -File "M:\WindowsPowerShell\Jest.ps1"

输出简单:

  

Jest.ps1

答案 4 :(得分:1)

检查$ Host.Name。如果您的脚本在IDE外部运行,则它将返回值ConsoleHost。否则,它将返回对IDE的引用,例如Windows PowerShell ISE HostPowerGUIScriptEditorHost

我必须使用SetShouldExit,因为运行我的脚本的调度程序通常会忽略指示失败的其他方法。我在SetShouldExit$Host.Name时添加了一个允许ConsoleHost的函数。它在测试过程中节省了大量的IDE崩溃。

答案 5 :(得分:0)

这直接回答了发帖人的问题,即您是否可以查询是否通过-NonInteractive开关启动了Powershell控制台。

Function Test-IsPowerShellConsoleNonInteractive { [Boolean]([Environment]::GetCommandLineArgs() -Match '-NonInteractive') }
$IsPSConsoleNonInteractive = Test-IsPowerShellConsoleNonInteractive
If ($IsPSConsoleNonInteractive) { $Host.SetShouldExit(2) }