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

如何通过PsCustomObject获取计算机名称以完善监控CSV日志?

解决CSV日志缺失计算机名称的问题

嘿,这个问题我太熟悉了!你现在的核心痛点就是没有把计算机名称和状态信息绑定在一起输出——原来的脚本可能只是单独输出了"offline"字符串,导致CSV里只有状态值,没有对应的机器名。用PsCustomObject正好能完美解决,它可以让你自定义统一的输出属性结构,把机器名、状态、服务信息都打包成对象,导出CSV时每一条记录都会清晰关联到对应的服务器。

完整示例脚本

# 定义要检查的服务器列表(也可以从文件读取,比如 Get-Content .\servers.txt)
$serverList = @("Server01", "Server02", "Server03", "Server04")
# 要监控的服务名称
$targetService = "WinRM"
# 日志文件路径
$logFile = ".\service_check_log.csv"

# 初始化空数组存储所有结果
$allResults = @()

foreach ($server in $serverList) {
    # 先执行ping测试,判断服务器是否在线
    $isOnline = Test-Connection -ComputerName $server -Count 1 -Quiet -ErrorAction SilentlyContinue

    if ($isOnline) {
        # 在线时尝试获取服务状态
        try {
            $service = Get-Service -ComputerName $server -Name $targetService -ErrorAction Stop
            
            # 只记录服务处于Stopped状态的情况(按需调整,也可以记录所有状态)
            if ($service.Status -eq "Stopped") {
                $allResults += [PsCustomObject]@{
                    ComputerName   = $server
                    ServerStatus   = "Online"
                    ServiceName    = $service.Name
                    ServiceStatus  = $service.Status
                    Notes          = "服务已停止"
                }
            }
        }
        catch {
            # 捕获获取服务失败的异常(比如权限不足、服务不存在)
            $allResults += [PsCustomObject]@{
                ComputerName   = $server
                ServerStatus   = "Online"
                ServiceName    = $targetService
                ServiceStatus  = "N/A"
                Notes          = "获取服务失败:$($_.Exception.Message)"
            }
        }
    }
    else {
        # 离线时,必须将计算机名写入结果对象
        $allResults += [PsCustomObject]@{
            ComputerName   = $server
            ServerStatus   = "Offline"
            ServiceName    = "N/A"
            ServiceStatus  = "N/A"
            Notes          = "无法ping通服务器"
        }
    }
}

# 导出结果到CSV,-Append用于追加记录,-NoTypeInformation移除类型注释
$allResults | Export-Csv -Path $logFile -Append -NoTypeInformation -Encoding UTF8

关键要点解析

  1. 强制绑定计算机名称:
    不管服务器是在线还是离线,创建PsCustomObject时都明确指定ComputerName = $server,这样每一条输出记录都会携带对应的机器名,CSV里就会自动生成ComputerName列。

  2. 统一输出结构:
    所有场景(离线、服务停止、服务获取失败)都使用相同的属性结构,这样导出的CSV会有一致的列,不会出现格式混乱的情况。

  3. 灵活调整记录规则:
    示例中只记录服务停止的情况,你可以根据需求修改——比如去掉if ($service.Status -eq "Stopped")判断,就能记录所有在线服务器的服务状态。

  4. 异常处理更严谨:
    加入try/catch捕获获取服务时的错误,避免脚本中断,同时把错误信息写入日志,方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:52:52