我使用Get-WMIObject和类Win32_Service来获取对服务的引用。我将该引用存储在变量中。我的问题是,我可以使用引用变量来获取服务状态的更新,还是需要执行另一个Get-WMIObject?
目前我用这个:
$parameters = @{
Class = 'Win32_Service'
ComputerName = $server
Credential = $script:credentials
Filter = "Name='$ServiceName'"
}
$targetservice = Get-WMIObject @parameters
$results = $targetservice.startservice()
if($results.returnvalue -eq 0)
{
do
{
start-sleep -milliseconds 100
} until((Get-WMIObject @parameters).state -eq 'Running')
}
我是否需要第二次调用Get-WMIObject,或者我可以这样做吗?
$parameters = @{
Class = 'Win32_Service'
ComputerName = $server
Credential = $script:credentials
Filter = "Name='$ServiceName'"
}
$targetservice = Get-WMIObject @parameters
$results = $targetservice.startservice()
if($results.returnvalue -eq 0)
{
do
{
start-sleep -milliseconds 100
$targetservice.interrogateservice()
} until(($targetservice).state -eq 'Running')
}
我知道询问服务是假设更新服务的状态,但由于某种原因,它无法正常工作并陷入循环中。
答案 0 :(得分:0)
WMI结果仅反映执行查询时的状态。您需要重新运行Get-WmiObject
才能获得当前状态。
答案 1 :(得分:0)
您已经接近。.不幸的是,InterrogateService不会更新$ targetservice对象,但它确实具有自己的返回码,可用于确定状态。
因此您可以使用以下if语句: if($ targetservice .InterrogateService()。ReturnValue -ne 6){“无法停止”}
有关返回码,请参见下面的Microsoft参考: https://docs.microsoft.com/en-us/windows/desktop/cimwin32prov/interrogateservice-method-in-class-win32-service
...但是我会再打一次WMI,因为返回码不是那么直接...我相信,如果状态没有从原始状态更改,它会给出0。因此,您必须考虑到这一点。