我在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中获取正确的操作,但是没有通过命令行获得正确的结果。
我想知道在ISE中运行时Windows是否使用了不同的环境变量。我注意到当我通过ISE运行时,控制台会以红色显示错误。
答案 0 :(得分: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一样。
答案 1 :(得分:1)
我有另一种解决方案。如果要编写一些代码来确定外部可执行文件的退出代码,可以使用Start-Process
cmdlet。实际上,我通常建议人们使用Start-Process
cmdlet而不是直接调用外部可执行文件,因为它有助于更好地处理参数值。在您的情况下,另一个好处是您可以使用-PassThru
-Wait
和Start-Process
,这意味着您可以获得一个表示该流程的对象,该对象还将包含其退出代码。 / p>
$CliArgs = '/all';
$Process = Start-Process -FilePath ipconfig.exe -ArgumentList $CliArgs -NoNewWindow;
Write-Host -Object $Process.ExitCode;
答案 2 :(得分:0)
PowerShell ISE处理错误的方式与PowerShell控制台不同。在ISE中,从控制台应用程序到其stderr流的所有输出都将写入PowerShell的错误流。我还没有发现改变这种行为。