我已经构建了一个小的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)
Given $arrService = Get-Service -Name $ServiceName,$arrService.Status是一个静态属性,对应于调用时的值。使用$arrService.Refresh()需要的属性更新到当前值时。
MSDN ~ ServiceController.Refresh()
通过将属性重置为其当前值来刷新属性值。
| 归档时间: |
|
| 查看次数: |
64999 次 |
| 最近记录: |