使用 passthru 确保 cmdlet 已完成

Use passthru to make sure the cmdlet is finished

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

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

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

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

如我所料,停止 IIS ApplicationPool 需要时间,并且由于 PowerShell 不等待 cmdlet 完成其工作,Stop-WebAppPool 停止应用程序池并 returns。由于应用程序池尚未准备好启动,因此调用 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 在应用程序池真正获得 stopped/started 之前不会产生任何结果。由于 -Passthru 需要将某些内容传递给管道,因此 PowerShell 等待 cmdlet 生成其结果,在本例中,应用程序池获取 stopped/started,以执行下一个。

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

-Passthru 用于将当前对象(即 AppPool)进一步传递到管道中。我不认为 Start/Stop-WebAppPool cmdlet 会在传递 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