PowerShell批量检查服务器在线状态及指定服务是否存在
服务器服务检查脚本修正方案
需求说明
- 读取「服务器列表.txt」文件中的服务器地址
- 执行两项核心操作:
- 测试服务器连通性,无法连接时输出提示:
Server $server not found - 服务器在线时检查指定服务:存在则返回服务基础信息;不存在则输出提示:
service does not exist on $server
- 测试服务器连通性,无法连接时输出提示:
现有问题
原脚本仅在服务器连通时尝试获取服务,但如果服务不存在,脚本会直接抛出错误并跳过后续提示,导致用户无法明确得知服务不存在的状态。
原脚本代码
$serverlist = Get-Content "C:\BTPM-PS-Scripts\servers.txt" foreach ($server in $serverlist){ if(Test-Connection -ComputerName $server -Count 1 -Quiet) { Invoke-Command -computername $server -ScriptBlock { Get-Service -name WHATEVERSERVICE } } else { Write-Host "Server $server not found" -ForegroundColor Yellow } }
错误尝试代码
foreach ($server in $serverlist){ if(Test-Connection -ComputerName $server -Count 1 -Quiet) { **NOT ACTUAL CODE BUT SHOULD CONTINUE IF "TEST-CONNECTION" CONDITION IS TRUE** } if(Invoke-Command -computername $server -ScriptBlock {Get-Service -name stor*}) { write-host "service exists" } elseif(Write-Host "stupid service doesn't exist") { continue } { Invoke-Command -computername $server -ScriptBlock { Get-Service -name avecto* } } else { Write-Host "Server $server not found" -ForegroundColor Yellow } }
修正后的脚本
$serverlist = Get-Content "C:\BTPM-PS-Scripts\servers.txt" $targetService = "WHATEVERSERVICE" # 替换为目标服务名,支持通配符 foreach ($server in $serverlist) { # 检测服务器连通性 if (-not (Test-Connection -ComputerName $server -Count 1 -Quiet)) { Write-Host "Server $server not found" -ForegroundColor Yellow continue } # 检查目标服务状态 try { $service = Invoke-Command -ComputerName $server -ScriptBlock { Get-Service -Name $using:targetService -ErrorAction Stop } # 服务存在,输出关键信息 Write-Host "`n[服务器 $server] 服务信息:" -ForegroundColor Green $service | Select-Object Name, DisplayName, Status, StartType } catch [Microsoft.PowerShell.Commands.ServiceCommandException] { # 捕获服务不存在的异常 Write-Host "service does not exist on $server" -ForegroundColor Red } catch { # 处理其他异常(如权限不足、远程执行失败) Write-Host "[服务器 $server] 操作失败:$($_.Exception.Message)" -ForegroundColor Red } }
关键修正点
- 异常捕获机制:通过
-ErrorAction Stop让Get-Service在服务不存在时抛出异常,再用try/catch精准捕获并输出对应提示 - 变量传递:使用
$using:targetService将本地定义的服务名传递到远程脚本块,避免硬编码 - 流程控制:用
continue跳过连通失败的服务器后续操作,逻辑更清晰 - 异常扩展:增加通用异常捕获,处理连通但无法执行命令的场景(如权限问题)
内容的提问来源于stack exchange,提问作者rickr214
相关产品推荐
相关产品推荐

