使用passthru确保cmdlet完成

won*_*sia 6 iis powershell web-administration powershell-3.0

我很困惑-Passthru

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

我尝试先编写这些代码:(我尝试不使用Restart-WebAppPoolcmdlet 来回收IIS应用程序池)

Stop-WebAppPool  -Name Foo
Start-WebAppPool -Name Foo
Run Code Online (Sandbox Code Playgroud)

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

因此,我将代码更改为以下代码:

Stop-WebAppPool  -Name Foo
Start-Sleep -Seconds SomeValueNeedToGetMeasuredAndChanged
Start-WebAppPool -Name Foo
Run Code Online (Sandbox Code Playgroud)

它可以工作,但不太灵活。

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

Stop-WebAppPool  -Name Foo -Passthru
Start-WebAppPool -Name Foo -Passthru
Run Code Online (Sandbox Code Playgroud)

一切正常,没有错误。

就我而言,我认为:

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

我在-Passthru或上都找不到任何有用的手册Stop-WebAppPool,因此在这种情况下可以这样做吗?

bea*_*ker 7

-Passthru用于将当前对象(即AppPool)进一步传递到管道中。我认为这不能保证,Start/Stop-WebAppPoolcmdlet将等待当前操作完成,然后再传递AppPool对象。现在可以使用,但是稍后可能会损坏。

解?使用Restart-WebAppPool。或者,如果您确实需要使用Start / Stop cmdlet,请执行以下操作:

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