7

どのように機能するか混乱して-Passthruいます。

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

Restart-WebAppPool最初にこれらのコードを記述しようとしました: (コマンドレットを使用せずに IIS アプリケーション プールをリサイクルしようとしています)

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

予想どおり、IIS ApplicationPool を停止するには時間がかかります。また、PowerShell はコマンドレットがジョブを完了するのを待たないためStop-WebAppPool、アプリケーション プールを停止して戻ります。アプリケーション プールを開始する準備ができていないため、Start-WebAppPoolが呼び出され、エラーがスローされます。

そこで、コードを次のように変更しました。

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

それは機能しますが、非常に優雅で柔軟ではありません。

次に、両方のコマンドレットに追加-Passthruすると、次のようになります。

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

すべてがうまくいき、エラーはスローされません。

私の場合、次のようになります。

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

-Passthruまたはのどちらにも有用なマニュアルが見つからStop-WebAppPoolないので、この場合はそうしてもよろしいですか?

4

1 に答える 1

8

-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 
于 2016-04-14T08:48:36.660 に答える