(.
あなたの現在の設定にあなたが. .\inner.ps1
呼び出し後に終了する必要があるかどうかをチェックmain.ps1
の条件いくつかを必要とするので)、スクリプトは、exit
にその呼び出し側に指示することはできません。 再帰は全く必要である理由ヘルパースクリプトinner.ps1
ドットソース化されているので、呼び出し側の環境を変更することができ、main.ps1
ことを考えると
、人は不思議。
しかし、この回答の残りの部分は質問の前提を受け入れています。
OP自身がa solution that encapsulates the recursive-invocation details inside inner.ps1
を思い付いたが、問題は、制御情報を送信するために成功ストリーム(通常の出力ストリーム)を使用していることである - $TRUE
または$FALSE
する - (その情報をチェックすることif
文を意味しますif (. .\inner.ps1) ...
)はの標準出力を消費します。したがって、はを抑制します。 [1]すなわち
:main.ps1
が全く出力を生成しないことが発生した場合のアプローチのみ動作し、または発信者が気にしない何が起こるかmain.ps1
出力。
### inner.ps1
if(-not $__inner_already_recursed) {
'inner: reinvoking main...'
$__inner_already_recursed=$true # set flag to indicate that recursion has happened
. $myInvocation.ScriptName # re-invoke main.ps1
exit 0 # Signal need to continue execution with $LASTEXITCODE 0
} else {
'inner: not reinvoking...'
exit 1 # Signal that this is already the 2nd invocation.
}
と:
溶液は、(PowerShellが自動変数$LASTEXITCODE
に反映)終了コードに制御フローをベースにあるOPの状態として
### main.ps1
'main: entering'
# Call the helper script that performs the recursive invocation.
. .\inner.ps1
if ($LASTEXITCODE -eq 1) { exit } # 1 means previously already reinvoked -> exit
# We only get here once, in the recursive invocation.
'main: should only get here once'
、再帰呼び出し状態をinner.ps1
に維持するために使用される補助変数は、あらかじめ存在してはいけません(少なくとも真実の値ではない)ので、その名前-012そのリスクを最小限に抑えるためにが選ばれました。
[1] Write-Host
呼び出しは、彼らがコンソールに直接印刷するので、影響を受けませんが、その出力は、キャプチャさもなく、パイプラインを介して送信することもできません。
nice weekend friendly user :) –