使用passthru确保cmdlet已完成

时间:2016-04-14 06:33:53

标签: powershell iis powershell-v3.0 web-administration

我对-Passthru的工作原理感到困惑。

根据我的理解,-Passthru参数用于将cmdlet的结果传递给管道,即使cmdlet本身也不会产生任何结果。

我首先尝试编写这些代码:(我正在尝试在不使用Restart-WebAppPool cmdlet的情况下回收IIS应用程序池)

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

正如我所料,停止IIS ApplicationPool需要时间,并且由于PowerShell不等待cmdlet完成其工作,Stop-WebAppPool会停止应用程序池并返回。由于应用程序池尚未准备好开始,因此调用Start-WebAppPool并抛出错误。

所以我将代码改为:

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

它有效,但不是很有弹性。

然后我将-Passthru添加到两个cmdlet中,它变为:

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

一切顺利,不会引发任何错误。

就我而言,我想:

在应用程序池真正停止/启动之前,Stop / Start-WebAppPool cmdlet不会产生任何结果。由于-Passthru需要将某些内容传递给管道,因此PowerShell会等待cmdlet生成其结果,在这种情况下,应用程序池会停止/启动,以执行下一个。

我在-PassthruStop-WebAppPool找不到任何有用的手册,所以在这种情况下这样做是否正常?

1 个答案:

答案 0 :(得分:4)

-Passthru用于将当前对象(即AppPool)进一步传递到管道中。我不认为它是有保证的,Start/Stop-WebAppPool cmdlet会在传递AppPool对象之前等待当前操作完成。它现在有效,但可能会晚点破坏。

解决方案?使用Restart-WebAppPool。或者,如果您确实需要使用“开始/停止”cmdlet,请执行以下操作:

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