![](/img/trans.png)
[英]How to check if a service is running via batch file and start it, if it is not running?
[英]Powershell, check that the service is running and if it is not, start it
我创建了一个 powershell 脚本来检测 X 服务是否处于活动状态,如果没有,它会启动它。 我还想在 while 中添加一个参数,以避免脚本卡住,并在多次尝试后 (2) 关闭脚本。
该脚本有效,它启动服务,但它尝试执行 or 即使第一条语句为真。 而不是它不起作用的原因:
$ServiceName = 'MSIREGISTER_MR'
$arrService = Get-Service -Name $ServiceName
$conteo = 0
while (($arrService.Status -ne 'Running') -or ($conteo -ne '2'))
{
Start-Service $ServiceName
write-host $arrService.status
write-host 'Arrancando el servicio...'
$conteo = $conteo +1
Start-Sleep -seconds 5
$arrService.Refresh()
if ($arrService.Status -eq 'Running')
{
Write-Host 'El servicio esta arrancado'
}
else
{
Write-Host 'Fallo al arrancar el servicio'
}
}
为什么会发生这种情况
在您今天的脚本中,您只在脚本顶部检查服务状态一次:
$arrService = Get-Service -Name $ServiceName
正如您在此处看到的,如果我尝试使用当前在我的 PC 上停止的 Xbox Live 游戏保存服务...
$service = get-service XblGameSave
Status Name DisplayName
------ ---- -----------
Stopped XblGameSave Xbox Live Game Save
C:\git\core> $service.Start()
C:\git\core> $service
Status Name DisplayName
------ ---- -----------
Stopped XblGameSave Xbox Live Game Save
我做了一个变量,我检查了它,然后我启动了服务。
当我检查时,Xbox Live Game 保存服务实际上已启动,但我的变量不知道。
但是,当我刷新变量时,我现在可以看到新状态。
PS> $service.Refresh()
Status Name DisplayName
------ ---- -----------
Running XblGameSave Xbox Live Game Save
使用.Refresh()
刷新变量是一件非常奇怪的事情,PowerShell 中除了服务之外基本上没有其他功能。
你需要做什么
您需要更新代码以每次都在循环内进行检查,以查看服务现在是否正在运行。
此外,您在循环中的条件似乎不正确。
while (($arrService.Status -ne 'Running') -or ($conteo -ne '2'))
这应该一直运行,直到服务正在运行,或者$conteo
大于 2(根据您的描述)。 这是在代码中应该如何做到这一点。
while (($arrService.Status -ne 'Running') -or ($conteo -gt '2'))
您的条件中存在逻辑缺陷; 将其更改为:
while ($arrService.Status -ne 'Running' -and $conteo -lt 2) { ...
这样,一旦服务成功启动或$conteo
达到值2
,即在第二次启动尝试失败后,您就退出循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.