0

我目前有一个脚本可以 ping 服务器列表并检查每台服务器上运行的服务的状态。我想写信给 log.csv。

我想显示哪些计算机处于脱机状态并显示哪些服务处于已停止状态。

如何使用 PSCustumObject 获取计算机或机器名称?CSV 输出只有一行表示离线,但它没有在其前面列出计算机名称。

$serviceList = Get-Content C:\services.txt

$results = Get-Content C:\servers.txt | ForEach-Object {
    if (Test-Connection -ComputerName $_ -BufferSize 16 -Count 1 -EA 0 -Quiet) {
        foreach ($service in $serviceList) {
            if ($s=get-service -computer $_ -name $service -ErrorAction SilentlyContinue)
            {
                $s | select MachineName, ServiceName, Status, StartType
            } else {
                # "$_ - Service '$service' does not exist."
            }
        }
    } else {
        $status = Write-Output "Offline"
    }

    [pscustomobject][ordered]@{
        Machine = $_
        Status = $status
    }
}

$results | Export-CSV C:\log.csv -notypeinformation -Append
4

1 回答 1

2

当您输出结果时,Get-Service您正在选择MachineName

$s | select MachineName, ServiceName, Status, StartType

然后对于离线计算机,您正在使用以下方法构建对象Machine

[pscustomobject][ordered]@{
    Machine = $_
    Status = $status
}

您需要更新您的自定义对象,MachineName使其与您在上面选择的属性相匹配。

它还需要移入else{}(替换$status = Write-Output "Offline"),因此仅在计算机离线时才调用它。

然后你会得到你期望的输出:

MachineName ServiceName 状态 StartType
------------ ------------ ------ ---------
localhost spooler 自动运行
localhost DusmSvc 自动运行
localhost DeviceInstall 已停止手动
无名 当前离线          

更新了代码,对不存在的服务进行了额外更新:

$serviceList = Get-Content C:\services.txt

$results = Get-Content C:\servers.txt| ForEach-Object {
    if (Test-Connection -ComputerName $_ -BufferSize 16 -Count 1 -EA 0 -Quiet) {
        foreach ($service in $serviceList) {
            if ($s = get-service -computer $_ -name $service -ErrorAction SilentlyContinue) {
                $s | select MachineName, ServiceName, Status, StartType
            }
            else {
                [pscustomobject][ordered]@{
                    MachineName = $_
                    ServiceName = $service
                    Status  = "NotFound"
                } 
            }
        }
    }
    else {
        [pscustomobject][ordered]@{
            MachineName = $_
            Status  = "Offline"
        } 
    }
}

$results | Export-CSV C:\log.csv -notypeinformation -Append
于 2018-03-06T16:55:28.250 回答