1

期待どおりに終了していたPowerShellISEでコマンドを実行していますが、コードをコマンドラインに移動してさまざまな環境で実行すると、エラーが発生しなくなりました。エラーは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-Processコマンドレットを利用できます。実際、Start-Process引数値をより適切に処理するのに役立つため、通常、外部実行可能ファイルを直接呼び出すのではなく、コマンドレットを使用することをお勧めします。他の利点は、あなたの場合、プロセスを表すオブジェクトを取得できることです。これは、プロセスを表すオブジェクトを取得できることを意味します。このオブジェクトには、終了コードも含まれ-PassThruます-WaitStart-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 に答える