2016-04-14 6 views
4

Ich bin verwirrt, wie -Passthru funktioniert.Verwenden Sie passthru, um sicherzustellen, dass das Cmdlet fertig ist

Aus meiner Sicht wird der Parameter -Passthru verwendet, um das Ergebnis eines Cmdlets an die Pipeline zu übergeben, selbst wenn das Cmdlet selbst keine Ergebnisse liefert.

Ich hat versucht, diesen Code zu schreiben, zuerst: (Ich versuche, den IIS-Applikations-Pool ohne Restart-WebAppPool Cmdlets zu recyceln)

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

Wie ich erwartet habe, es braucht Zeit, um eine IIS Application zu stoppen, und da PowerShell wartet nicht, bis Cmdlets ihren Job beendet haben. Die Anwendung Stop-WebAppPool stoppt den Anwendungspool und kehrt zurück. Da der Anwendungspool nicht bereit für den Start ist, wird Start-WebAppPool aufgerufen und Fehler wird ausgelöst.

Also änderte ich meinen Code in diese:

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

Es funktioniert aber nicht sehr elegent und flexibel.

Dann füge ich -Passthru auf beide der Cmdlets, wird es:

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

Alles geht in Ordnung und kein Fehler ausgelöst wird.

In meinem Fall, ich nehme an:

Der Stop/Start-WebAppPool Cmdlets keine Ergebnisse produziert, bis wirklich der Anwendungspool angehalten werden/gestartet. Da -Passthru etwas zum Übergeben an die Pipeline benötigt, wartet PowerShell, bis das Cmdlet das Ergebnis erzeugt. In diesem Fall wird der Anwendungspool gestoppt/gestartet, um den nächsten auszuführen.

Ich kann keine nützlichen Handbücher entweder -Passthru oder Stop-WebAppPool finden, also ist es in diesem Fall in Ordnung?

Antwort

3

-Passthru wird verwendet, um das aktuelle Objekt (d. H. AppPool) in der Pipeline weiterzuleiten. Ich glaube nicht, dass es garantiert ist, dass Start/Stop-WebAppPool Cmdlets darauf warten, dass der aktuelle Vorgang abgeschlossen wird, bevor das AppPool-Objekt übergeben wird. Es funktioniert jetzt, aber es könnte später brechen.

Lösung? Verwenden Sie Restart-WebAppPool. Oder wenn Sie wirklich Start/Stop-Cmdlets verwenden müssen, tun Sie es so:

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

Vielen Dank für Ihre Erklärung! Ich habe '-PassThru' entfernt und die oben angegebenen Codes verwendet! Klappt wunderbar! – WonTasia