我有两个更多的服务,它们具有相同的命名约定,如下所示。我正在寻找一种编写PowerShell脚本的方法,它应该检查服务名称,并确保服务正在运行,如果没有启动服务,那么其余的服务就应该停止。当服务启动时,它应该输出该服务已经启动。我的当前脚本只在服务尚未运行时才运行它。感谢你在这里提供帮助。
例如: srvx1,srvx2,srvx3,srvx4等等.
$ServiceName = 'srvx3'
$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'
}
}发布于 2022-10-28 22:59:58
cmdlet get-service的参数get-service支持*,因此可以这样做:
$ServiceName = 'srvx*'
$arrService = Get-Service -Name $ServiceName现在,您拥有了数组$arrayService中名称以srv开头的所有服务。
如果您想监视该服务,并且一旦它关闭,您应该将while循环中的条件设置为-eq,而不是-ne,因为您希望while循环执行,直到服务崩溃.否则,它会退出,因为服务正在运行,如果服务出现故障,它将永远不会启动:
#pick specific service out of list of all services
$service = ($arrService | ?{$_.name -eq 'srvx3'})
while ($service.Status -eq 'Running'){
Start-Sleep -seconds 60
#refresh status of all services
$arrService.Refresh()
If ($service.Status -eq 'Stopped'){
try {
$null = $service.start()
$null = $service.Refresh()
write-host $service.name $service.status
}
Catch {
write-error "failed to start service $($service.name) - Exception: $_"
#exit as unable to start service
return
}
#stop all other services if they are running
($arrService | ?{$_.name -ne $service.name -and $_.status -eq 'Running'}).Stop()
}
}希望我能够很好地理解您,目前,脚本将监视特定服务的状态,如果这个服务下降,脚本将启动它并停止所有其他以定义模式命名的服务。此外,它将继续监视服务,甚至继续监视,如果它启动了服务,它只会在启动服务失败时退出while循环。
https://stackoverflow.com/questions/74239714
复制相似问题