7

我很困惑如何-Passthru工作。

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

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

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

正如我所料,停止 IIS 应用程序池需要时间,并且由于 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 产生其结果,在这种情况下,应用程序池停止/启动,以执行下一个。

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

4

1 回答 1

8

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