won*_*sia 6 iis powershell web-administration powershell-3.0
我很困惑-Passthru
。
据我了解,该-Passthru
参数用于将cmdlet的结果传递给管道,即使cmdlet本身不产生任何结果。
我尝试先编写这些代码:(我尝试不使用Restart-WebAppPool
cmdlet 来回收IIS应用程序池)
Stop-WebAppPool -Name Foo
Start-WebAppPool -Name Foo
Run Code Online (Sandbox Code Playgroud)
如我所料,停止IIS ApplicationPool需要花费时间,并且由于PowerShell不等待cmdlet完成其工作,因此将Stop-WebAppPool
停止应用程序池并返回。由于应用程序池尚未准备好开始,因此Start-WebAppPool
将调用并引发错误。
因此,我将代码更改为以下代码:
Stop-WebAppPool -Name Foo
Start-Sleep -Seconds SomeValueNeedToGetMeasuredAndChanged
Start-WebAppPool -Name Foo
Run Code Online (Sandbox Code Playgroud)
它可以工作,但不太灵活。
然后,我-Passthru
将这两个cmdlet 添加到其中,它变为:
Stop-WebAppPool -Name Foo -Passthru
Start-WebAppPool -Name Foo -Passthru
Run Code Online (Sandbox Code Playgroud)
一切正常,没有错误。
就我而言,我认为:
在真正停止/启动应用程序池之前,Stop / Start-WebAppPool cmdlet不会产生任何结果。由于-Passthru
需要将某些内容传递到管道,因此PowerShell等待cmdlet产生其结果,在这种情况下,将停止/启动应用程序池以执行下一个。
我在-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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4640 次 |
最近记录: |