2010-12-08 23 views
6

スケジュールされたタスクとして実行されているスクリプトがたくさんあります。したがって、障害発生時に$host.setshouldexit(1)を実行します。これは、タスクスケジューラでリターンコードとして表示されます。Powershellスクリプトから終了コードを返す方法対話的でない場合のみ

また、これらのスクリプトをデバッグとテスト中に対話的に実行できるようにしたいと考えています。したがって、$host.setshouldexit()は私のPowerShellセッションまたはISEセッションを終了させます。

私の質問は、スクリプトが非対話的に実行されているかどうかをどのように検出できますか?そうであれば、setshouldexitを使用します。そうしないと、エラーコードまたは何かを破壊しないものが印刷されます。 ([environment]::userinteractiveを使用したくないことに注意してください。なぜなら、これらのスクリプトは、OSが非インタラクティブなセッションであると考えるものではないからです。)

私がスケジュールされたタスクに使用している - 。私がpowershellから問い合わせることができる方法はありますか?

答えて

6

$Host.SetShouldExitメソッドは必要ではありません。スクリプトの呼び出し方法によっては、実際には一貫性がありません。キーワードexitを使用すると、終了ステータスが表示されます。 powershell -F script.ps1使用

  • exitから
  • SetShouldExit作品 - powershell -c '.\script.ps1を使用して

を無視:

  • exit - ステータスが0または1に減少し、成功または失敗のためにスクリプトの、respe ctively。
  • SetShouldExit - 正しいステータスで終了しますが、スクリプトの残りの行は引き続き実行されます。powershell -c '.\script.ps1; exit $LASTEXITCODE [1]使用

  • exitは -
  • SetShouldExitに動作します - スクリプトのステータス== 0で終了し、残りの行はまだ実行されています。

のPowerShell(> .\script.ps1)から直接呼び出す:

  • exitから
  • SetShouldExitに動作します - 指定した終了ステータス
2

テスト中に正しい動作を設定するパラメータ "testing"を取得するだけではないのはなぜですか?ヒストリバッファを持っているので、これ以上実行する必要はありません。

+0

ええと、それほど悪くはありません。買います。 – scobi

2

私は同じ問題がありました。私のために、次の作品は:

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

インタラクティブなISEよりも多くのシェルがあります。 – scobi

2

あなたの質問を発見すると私は少し問題をさらに採取し$MyInvocation.MyCommand.Nameを発見しました。これは、コマンドインタープリタとISEコマンドインタープリタの両方でFalseです。そして、ちょうどライン含むスクリプト(私はjest.ps1ある)とき:出力は、単にある

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

Jest.ps1

として Write-Host $MyInvocation.MyCommand.Nameがたpowershell.exeするcmd.exeの呼び出しから実行されます
+0

また、$ host.SetShouldExit(1)を使用していただきありがとうございます! – Stef

+0

インラインコードはバッククォート( ')でマークアップされています。コードブロックは、各行を4つのスペースでインデントすることによってマークアップされています。 [編集に関するよくある質問](http://stackoverflow.com/editing-help#comment-formatting)をご覧ください。 –

1

チェック$ Host.NameでPowerShellのホストを呼び出して終了します。スクリプトがIDEの外部で実行されている場合、 "ConsoleHost"という値が返されます。それ以外の場合は、「Windows PowerShell ISEホスト」や「PowerGUIScriptEditorHost」などのIDEへの参照が返されます。

私のスクリプトを実行するスケジューラは通常、失敗を示す他の方法を無視するため、SetShouldExitを使用する必要があります。 $ Host.Nameが "ConsoleHost"の場合、SetShouldExitを許可する関数を追加します。これは、テスト中にIDEクラッシュの多くを節約します。

+0

スクリプトをジョブとして実行すると、$ Host.Nameは "ServerRemoteHost"(PS v5でテスト済み)になります。 –

関連する問題