我对-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生成其结果,在这种情况下,应用程序池会停止/启动,以执行下一个。
我在-Passthru
或Stop-WebAppPool
找不到任何有用的手册,所以在这种情况下这样做是否正常?
答案 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