用于检查服务是否已启动的Powershell脚本,如果没有则启动它

Dav*_*ugg 18 powershell

我已经构建了一个小的PowerShell脚本来检查服务是否已启动.如果没有启动,请尝试启动它,然后等待一分钟再次检查.继续重复此过程,直到服务成功启动.我发现循环不像我预期的那样,因为我似乎必须在循环中重新分配服务变量才能获得更新状态.这是我的代码:

$ServiceName = 'Serenade'
$arrService = Get-Service -Name $ServiceName

if ($arrService.Status -ne 'Running'){
$ServiceStarted = $false}
Else{$ServiceStarted = $true}

while ($ServiceStarted -ne $true){
Start-Service $ServiceName
write-host $arrService.status
write-host 'Service started'
Start-Sleep -seconds 60
$arrService = Get-Service -Name $ServiceName #Why is this line needed?
if ($arrService.Status -eq 'Running'){
$ServiceStarted = $true}
}
Run Code Online (Sandbox Code Playgroud)

如果我运行代码没有第三行(带注释的那一行),我得到以下输出.我可以检查Windows服务管理器,并在第一次循环后显然启动了服务.为什么需要第三个最后一行?

在此输入图像描述

鉴于此行为,是否有更好的方法来编写此代码?

谢谢

小智 31

我认为您的代码可能过于复杂:如果您只是检查服务是否正在运行,如果没有,请运行它然后停止重新评估,以下内容就足够了:

刷新的好点.

$ServiceName = 'Serenade'
$arrService = Get-Service -Name $ServiceName

while ($arrService.Status -ne 'Running')
{

    Start-Service $ServiceName
    write-host $arrService.status
    write-host 'Service starting'
    Start-Sleep -seconds 60
    $arrService.Refresh()
    if ($arrService.Status -eq 'Running')
    {
        Write-Host 'Service is now Running'
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 9

一个可能更简单的解决方案:

get-service "servicename*" | Where {$_.Status -neq 'Running'} | start-service
Run Code Online (Sandbox Code Playgroud)


riv*_*ivy 5

Given $arrService = Get-Service -Name $ServiceName,$arrService.Status是一个静态属性,对应于调用时的值。使用$arrService.Refresh()需要的属性更新到当前值时。

MSDN ~ ServiceController.Refresh()

通过将属性重置为其当前值来刷新属性值。