You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell批量检查服务器在线状态及指定服务是否存在

服务器服务检查脚本修正方案

需求说明

  • 读取「服务器列表.txt」文件中的服务器地址
  • 执行两项核心操作:
    1. 测试服务器连通性,无法连接时输出提示:Server $server not found
    2. 服务器在线时检查指定服务:存在则返回服务基础信息;不存在则输出提示: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
    }
}

关键修正点

  1. 异常捕获机制:通过-ErrorAction Stop让Get-Service在服务不存在时抛出异常,再用try/catch精准捕获并输出对应提示
  2. 变量传递:使用$using:targetService将本地定义的服务名传递到远程脚本块,避免硬编码
  3. 流程控制:用continue跳过连通失败的服务器后续操作,逻辑更清晰
  4. 异常扩展:增加通用异常捕获,处理连通但无法执行命令的场景(如权限问题)

内容的提问来源于stack exchange,提问作者rickr214

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:27:06