1

我在 powershell ISE 中运行的命令退出了我的预期,但是当我将代码移动到命令行以在不同的环境中执行时,我不再收到错误。该错误仅发生在 ISE 中。我曾尝试像其他人发布的那样在命令行上使用 -sta,但没有运气。

$SIEBEL_HOME\srvrmgr.exe /c "Run Command"
echo "Exit Code: $lastExitCode - Return Code: $?"

当我通过 ISE 运行它时,我得到以下输出:

Exit Code: 0 - Return Code: False

当我在命令行上运行该命令时,我得到以下输出:

E:\powershell.exe -sta -file script.ps1

Exit Code: 0 - Return Code: True

如您所见,我正在尝试检查返回代码并在 ISE 中获得正确的操作,但没有通过命令行获得正确的结果。

我想知道 Windows 在 ISE 中运行时是否使用了不同的环境变量。我注意到当我通过 ISE 运行它时,控制台以红色显示错误。

4

3 回答 3

2

$?变量仅检查最后执行的 PowerShell 命令的成功状态,而不检查外部可执行文件。

$LASTEXITCODE变量检测来自外部可执行文件的最后一个退出代码。

如您所见,这些变量用于不同的目的,因此您不会看到它们之间的一致性。有关它们的更多信息,请运行以下命令:

 Get-Help -Name about_Automatic_Variables

编辑:运行此代码以显示 $? 变量作品。

# Here we'll show a successful command, and then a failed .NET method call
Write-Output -Object "hi"; # Run a successful command
Write-Host -Object $?; # True = command succeeded
[System.IO.File]::NonExistentMethod();
Write-Host -Object $?; # False = command failed

# Here we'll show a successful command, followed by a failed executable call
Write-Output -Object "hi" | Out-Null; # Run a successful command
Write-Host -Object $?; # True = last command ran successfully
ipconfig /nonexistentparameter | Out-Null;
Write-Host -Object $?; # False = last command did not run successfully

对我来说,运行 PowerShell v3 Release Candidate,它在控制台中的工作方式与 ISE 相同。

于 2012-07-09T21:44:41.140 回答
1

我对你的情况有另一种解决方案。如果您想编写一些代码来确定外部可执行文件的退出代码,您可以使用Start-Processcmdlet 来发挥您的优势。事实上,我通常建议人们使用Start-Processcmdlet 而不是直接调用外部可执行文件,因为它有助于更​​好地处理参数值。在您的情况下,另一个好处是您可以-PassThru-Waitwith Start-Process,这意味着您可以获得一个表示进程的对象,该对象还将包括其退出代码。

$CliArgs = '/all';
$Process = Start-Process -FilePath ipconfig.exe -ArgumentList $CliArgs -NoNewWindow;
Write-Host -Object $Process.ExitCode;
于 2012-07-10T17:18:45.123 回答
0

PowerShell ISE 处理错误的方式与 PowerShell 控制台不同。在 ISE 中,从控制台应用程序到其 stderr 流的所有输出都被写入 PowerShell 的错误流。我还没有找到改变这种行为的方法。

于 2012-07-11T00:41:10.850 回答