使用 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,以执行下一个。
我在 -Passthru
或 Stop-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
我对 -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,以执行下一个。
我在 -Passthru
或 Stop-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