PowerShellでスクリプトを終了する


394

関数内で回復不可能なエラーが発生したときにPowerShell(PS1)スクリプトを終了する方法を探していました。例えば:

function foo() {
    # Do stuff that causes an error
    $host.Exit()
}

もちろんのようなものはありません$host.Exit()。はありますが$host.SetShouldExit()、これは実際にはコンソールウィンドウを閉じます。私が必要としているのsys.exit()は、現在のスクリプトの実行をさらに回避することなく単に停止するPythonのものと同等のものです。

編集:ええ、それだけexitです。ああ。


8
私の場合、PowerShellウィンドウまたはISEを閉じたくない場合は、代わりに「return」を使用してください。現在実行中のコンテキストを終了するだけです。「新しい男」は、教育目的のためのすべてのオプションを徹底的に説明します。将来のStackOverflowユーザーのために、承認された回答を変更することを検討することをお勧めします(現在、いずれにしても賛成票が増えています)。スクリプトをデバッグすることもできます。
ZaxLofful 2016年

これはあなたの質問に答えますか?PowerShellの「終了」とは正確には何ですか?
Mark Schultheiss

回答:


389

キーワードを使用しexitください。


15
なんてこった、私がこれらのことをうまく行う方法を理解しようとすることにそれほど夢中にならなかったなら、私はおそらくそれを最初に試してみてそれが機能することを理解したでしょう:)ありがとう。
kprobst

118
これはどのように受け入れられた答えですか?それは、質問者が「私が望むものではない」と言った「コンソールウィンドウを閉じる」ことを明確に行います。
claudekennilol 2013年

3
@claudekennilol質問者のみが回答を受け入れることができます。彼らは出口が窓を閉めることになっているという事実を見落としたか、彼らは彼らの考えを変えて、彼らの目的のためにそれを受け入れられると考えました。
Iszi 2013

3
私が使用しているv3またはv4のコンソールウィンドウは閉じません。ええと、エクスプローラからスクリプトを実行すると、スクリプトはどのように終了しても実行されます。PowerShellコマンドウィンドウから実行する場合、ウィンドウは閉じません。
Joshua Nurczyk 2015年

14
New Guyの答えははるかに徹底的であり、受け入れられるものとしてマークされています。
Jim Aho

585

これは古い投稿であることに気づきましたが、このトピックを検索する際の上位の検索結果の1つであるため、このスレッドに何度も戻ってきます。しかし、私は情報が矛盾しているために来たときよりも常に混乱しています。最終的には、それを理解するために常に自分のテストを実行する必要があります。今回は調査結果を掲載します。

TL; DRほとんどの人はExit、実行中のスクリプトを終了するために使用したいと思うでしょう。ただし、スクリプトが単にシェルで後で使用する関数を宣言している場合Returnは、その関数の定義で使用する必要があります。

終了vsリターンvsブレイク

  • 終了:現在実行中のコンテキストを「終了」します。スクリプトからこのコマンドを呼び出すと、スクリプトが終了します。シェルからこのコマンドを呼び出すと、シェルを終了します。

    関数がExitコマンドを呼び出すと、実行中のコンテキストがすべて終了します。そのため、その関数が実行中のスクリプト内からのみ呼び出される場合、そのスクリプトは終了します。ただし、現在のシェルから使用できるようにスクリプトで関数を宣言するだけで、その関数をシェルから実行する場合、シェルはExitコマンドを含む関数が実行されているコンテキストであるため、シェルを終了します。

    注:デフォルトでは、スクリプトを右クリックしてPowerShellで実行すると、スクリプトの実行が完了すると、PowerShellが自動的に閉じます。これは、Exitコマンドやスクリプト内の他のものとは関係ありません。これは、この特定のスクリプト実行方法を使用して実行されるスクリプトの既定のPowerShell動作にすぎません。バッチファイルとコマンドラインウィンドウについても同様です。

  • 戻る:前の呼び出しポイントに戻ります。このコマンドをスクリプトから(関数の外で)呼び出すと、シェルに戻ります。このコマンドをシェルから呼び出すと、シェルに戻ります(これは、シェルから実行された単一のコマンドの前の呼び出しポイントです)。このコマンドを関数から呼び出すと、関数が呼び出された場所に戻ります。

    コールポイントが戻された後のコマンドの実行は、そのポイントから続行されます。スクリプトがシェルから呼び出され、Return関数の外にコマンドが含まれている場合、スクリプトがシェルに戻ると、実行するコマンドがなくなるReturnため、この方法でのの使用方法はと本質的に同じになりExitます。

  • Break:ループから抜け出し、ケースを切り替えます。ループまたはスイッチケースではないときにこのコマンドを呼び出すと、スクリプトから抜け出します。Breakループ内にネストされているループ内で呼び出すと、呼び出されたループから抜け出すだけです。

    Breakループの前にラベルを付けることができ、そのラベル付きループBreak内のネストされた複数のグループ内でコマンドが呼び出された場合でも、そのラベル付きループから抜け出すことができるという興味深い機能もあります。

    While ($true) {
        # Code here will run
    
        :myLabel While ($true) {
            # Code here will run
    
            While ($true) {
                # Code here will run
    
                While ($true) {
                    # Code here will run
                    Break myLabel
                    # Code here will not run
                }
    
                # Code here will not run
            }
    
            # Code here will not run
        }
    
        # Code here will run
    }

39
またExit、戻りコードをパラメーターとして取ることができることに注意してください(デフォルトは0です)Exit 3
aucuparia 2014

2
私は同意します、これははるかに良い答えです。「ブレーク」は意図しない結果をもたらす可能性があります。
iagomartinez 2014年

「終了」についてのあなたのコメントが完全に正しいとは思いませんが、これは全体として素晴らしい答えです。終了が原因で、他に何も実行されていないようにISEが閉じているようです。コンテキストを終了するだけ(たとえば、スクリプトの完了)ではこれは行われません。
ビルK

1
@BillK確かに。答えを更新しました。私が初めてこれを書いたとき、Exitに関する公式のドキュメントが見つからなかったことを覚えています。それから私はしました、Get-Command ExitそしてGet-Alias Exit、結果がありませんでした。次に、それがキーワードであるかどうかを調べたところ、公式のドキュメントは見つかりませんでした。しかし、今それを見ると、どうしてその結論に至ったのかわかりません。明らかにそれはキーワードです(technet.microsoft.com/en-us/library/hh847744.aspx)。おそらく、Exitは、独自のabout_ヘルプトピックを持たない唯一のキーワードの1つであるため、左側のサイドバーのトピックのリストには含まれていません。
新しいガイ

6
スローはどうですか?
JDC 2016年

80

ExitPowerShellも終了します。現在の関数またはスクリプトだけから「脱出」したい場合-を使用してくださいBreak:)

If ($Breakout -eq $true)
{
     Write-Host "Break Out!"
     Break
}
ElseIf ($Breakout -eq $false)
{
     Write-Host "No Breakout for you!"
}
Else
{
    Write-Host "Breakout wasn't defined..."
}

5
break現在の関数から抜け出すだけの場合は使用しないでください。スクリプトの呼び出しも中断される可能性があります。
DannyMeister 2017

49

Write-Errorは非終了エラー用であり、throwは終了エラー用です

Write-Errorコマンドレットは、終了しないエラーを宣言します。デフォルトでは、エラーはエラーストリームでホストプログラムに送信され、出力とともに表示されます。

非終了エラーはエラーストリームにエラーを書き込みますが、コマンド処理は停止しません。入力項目のコレクション内の1つの項目で非終了エラーが宣言されている場合、コマンドはコレクション内の他の項目の処理を続行します。

終了エラーを宣言するには、Throwキーワードを使用します。詳細については、about_Throw(http://go.microsoft.com/fwlink/?LinkID=145153)を参照してください


4
これは、エラーでアクティビティを終了するための最も正しい方法のようです。エラーを処理しようとする呼び出し元に委任します。これは、単に突然終了しようとするよりもはるかに優れています。
ポールターナー、

私にとって、少なくともモジュール関数では、exitをスローしますが、exitコードを設定しません。これは、CLIなどを介して実行されましたpowershell -command "& module-function ..."。実際にエラー終了コードを出力するには、これらの関数を変換してラッピングtry-catchに変換し、そのラッピングキャッチを終了する必要がありました。
Josh

2
$PSCmdlet.ThrowTerminatingError()スローがジョブを実行できない場合のインスタンスを忘れないでください(からの終了エラーがない既知の問題throw
Djarid

33

このプロセスを終了し、基になるオペレーティングシステムに指定された終了コードを提供します。

https://msdn.microsoft.com/en-us/library/system.environment.exit%28v=vs.110%29.aspx

[Environment]::Exit(1)

これにより、呼び出し元から取得できる特定の終了コードで終了できます。


3
PowerShellでは、このために組み込みのExitを使用するだけExit 1です。
ジョナス

3
組み込みのExitは、常に期待どおりに動作するとは限りません。これをpowershellで試してください: "Exit 5"> test1.ps1 powershell.exe。\ test1.ps1 $ lastexitcode "[Environment] :: Exit(5)"> test2.ps1 powershell.exe。\ test2.ps1 $ lastexitcode
gabriwinter

1
[Environment]::Exit(1)スクリプトでウィンドウを呼び出すと、Powershellウィンドウが終了するという副作用がありますexit
Josh Desmond

25

Return代わりにあなたが探していると思いますBreak。通常、Breakはループに使用され、最も内側のコードブロックからのみブレークします。関数またはスクリプトを終了するには、Returnキーを使用します。


7
これは不正解です。OPは特に、関数内からスクリプトを終了するように求めますReturnスクリプトからではなく、関数から単純に戻ります。(Returnトップスクリプトのレベルのスクリプトを終了しますが、それは問題ではありませんでした。)
マイケル・Sorens

1
この「回答」は実際にEverydayNerdの回答にコメントしたものですか。
tkokasih 2014

22

例外をスローすることは、特にエラーの理由を明確にしたい場合に適しています。

throw "Error Message"

これにより、終了エラーが発生します。


3
これは、ほぼ1年前のGreg Brayの回答以上のものではないと思います。stackoverflow.com
Jason S

12

「トラップ」を使用する方が良いかもしれません。PowerShellトラップは、終了またはエラーが発生したときに実行するコードブロックを指定します。タイプ

Get-Help about_trap

トラップステートメントの詳細については、


10

私は偶然ということが分かった(例えば、単に、ラベルがどこに存在するしない(でも関数内から)、スクリプト全体から抜け出すために表示され、生きているホストを保持します)。 このようにして、現在のスコープを知らずに(そしてラベルを作成せずに)どこからでもスクリプトを中断する関数(たとえば、再帰ループ)を作成できます。Break <UnknownLabel>Break ScriptScript

Function Quit($Text) {
    Write-Host "Quiting because: " $Text
    Break Script
} 

1
あなたの答えは本当ですが、彼らはスクリプト全体終了するにはあなたの欲求に同意しない場合、これはあなたのスクリプトの呼び出し元に問題を引き起こす可能性があります注意してください。stackoverflow.com/questions/45746588/...
DannyMeister

5

これをプログラムの再実行に使用しました。それが役立つかどうかはわかりませんが、2つの異なるエントリのみを必要とする単純なifステートメントです。それは私のためにPowerShellで動作しました。

$rerun = Read-Host "Rerun report (y/n)?"

if($rerun -eq "y") { Show-MemoryReport }
if($rerun -eq "n") { Exit }

これが役立つかどうかはわかりませんが、これは、プログラムを実行した後にプログラムを終了することになると思います。ただし、この場合、定義されたすべての入力には、リストおよび分類された出力が必要です。出口で新しいプロンプト行を呼び出して、プログラムをそのように終了することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.