2016-04-14 19 views
4

-Passthruの仕組みが混乱しています。パススルーを使用してコマンドレットが終了していることを確認してください

-Passthruパラメータは、コマンドレット自体が結果を生成しない場合でも、コマンドレットの結果をパイプラインに渡すために使用されます。

は、私が最初にこれらのコードを記述してみました:

Stop-WebAppPool -Name Foo 
Start-WebAppPool -Name Foo 

(私はRestart-WebAppPoolコマンドレットを使用せずに、IISアプリケーションプールをリサイクルしようとしている)私が予想したように、それはIIS ApplicationPoolを停止する時間がかかり、以来、 PowerShellはコマンドレットが完了するまで待機せず、Stop-WebAppPoolはアプリケーションプールを停止して戻ります。アプリケーションプールが開始する準備ができていないため、Start-WebAppPoolが呼び出され、エラーがスローされます。

だから私は、これらの中に私のコードを変更:

Stop-WebAppPool -Name Foo 
Start-Sleep -Seconds SomeValueNeedToGetMeasuredAndChanged 
Start-WebAppPool -Name Foo 

それは非常にelegentで柔軟な働きはありません。

その後、私は、コマンドレットの両方に-Passthruを追加し、それは次のようになります。

Stop-WebAppPool -Name Foo -Passthru 
Start-WebAppPool -Name Foo -Passthru 

すべてが正常になり、エラーがスローされません。私の場合は

、私は考えます:

アプリケーションプールは本当に開始/停止しますまで、ストップ/スタート・WebAppPoolコマンドレットは何も結果を生成しません。 -Passthruは何かをパイプラインに渡す必要があるため、PowerShellはコマンドレットが結果を生成するのを待ちます。この場合、アプリケーションプールは停止/開始され、次の処理を実行します。

-PassthruまたはStop-WebAppPoolのいずれの便利なマニュアルも見つからないので、この場合は問題ありませんか?

答えて

3

-Passthruは、現在のオブジェクト(つまりAppPool)をさらにパイプラインに渡すために使用されます。私はそれが保証されているとは思わない、Start/Stop-WebAppPoolコマンドレットは現在の操作が完了するのを待ってからAppPoolオブジェクトを渡す。今は動作しますが、後で中断する可能性があります。

解決策? Restart-WebAppPoolを使用してください。または、Start/Stopコマンドレットを実際に使用する必要がある場合は、次のようにします。

$AppPool = 'Foo' 
Stop-WebAppPool -Name $AppPool 
while((Get-WebAppPoolState -Name $AppPool).Value -ne 'Stopped'){ 
    Start-Sleep 1 
} 
Start-WebAppPool -Name $AppPool 
+0

ありがとうございました!私は '-PassThru'を削除し、上で提供したコードを使用しました!魅力的な作品! – WonTasia

関連する問題