Powershell 使用passthru确保cmdlet已完成

Powershell 使用passthru确保cmdlet已完成,powershell,iis,powershell-3.0,web-administration,Powershell,Iis,Powershell 3.0,Web Administration,我对-Passthru的工作原理感到困惑 据我所知,-Passthru参数用于将cmdlet的结果传递到管道,即使cmdlet本身不产生任何结果 我尝试先编写以下代码:(我尝试在不使用Restart-WebAppPoolcmdlet的情况下回收IIS应用程序池) 正如我所预料的,停止IIS应用程序池需要时间,而且由于PowerShell不会等待cmdlet完成其作业,stop WebAppPool会停止应用程序池并返回。由于应用程序池尚未准备好启动,因此将调用Start WebAppPool,并

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

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

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

正如我所预料的,停止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
一切正常,没有抛出错误

就我而言,我想:

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


我找不到任何关于
-Passthru
停止WebAppPool
的有用手册,所以在这种情况下可以这样做吗?

-Passthru
用于将当前对象(即AppPool)进一步向下传递。我认为不能保证,
Start/stopWebAppPool
cmdlet会在传递AppPool对象之前等待当前操作完成。现在可以用了,但以后可能会坏

解决方案?使用。或者,如果确实需要使用Start/Stop cmdlet,请按以下方式执行:

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

谢谢你的解释!我删除了
-PassThru
,并使用了您在上面提供的代码!工作起来很有魅力!
$AppPool = 'Foo'
Stop-WebAppPool -Name $AppPool 
while((Get-WebAppPoolState -Name $AppPool).Value -ne 'Stopped'){
    Start-Sleep 1
}
Start-WebAppPool -Name $AppPool