外部foreach循环内的Add-Member不将迭代导出到CSV

时间:2017-12-28 16:02:52

标签: powershell foreach hashtable

输入:

服务器:[1,2,3]
服务:[a,b,c]

服务器1具有服务“a”
服务器2具有服务“a”,“b”
服务器3具有服务“b”,“c”

CSV中的预期输出(在控制台上给出正确的输出):

Server_Name ServerAvailability ServiceName[0] ServiceStatus[0] ServiceName[1] ServiceStatus[1]
1 Up a Running
2 Up a Running b Running
3 Up b Running c Running

CSV中的实际输出:

Server_Name ServerAvailability ServiceName[0] ServiceStatus[0] ServiceName[1] ServiceStatus[1]
1 Up a Running
2 Up a Running
3 Up b Running
foreach

输出正确。没有显示错误。 CSV文件发生错误。突出显示的Service Name[0]循环不会被迭代。它会在Service Status[0]Bootstrap 4停止。请帮帮我。

1 个答案:

答案 0 :(得分:0)

你误解了Export-Csv的工作原理。 cmdlet将对象列表作为输入,并从该列表中的第一个对象确定CSV的列。对于所有后续对象,缺少的属性将填充空值,并省略其他属性。

要获得您想要的结果,您需要知道最大数量的服务,并将该数量的属性添加到每个对象。或者,您可以通过构建逗号分隔字符串列表并通过Set-ContentOut-File写入来手动创建CSV。当然,两者都是可行的,但更简单,更直接的方法是将服务列表放入具有不同分隔符的单个列中:

$infoColl = foreach ($s in $servers) {
    $svc = Get-Service -Name $services -Computer $s -ErrorAction SilentlyContinue |
           ForEach-Object { '{0}={1}' -f ($_.Name, $_.Status) }

    New-Object PSObject -Property @{
        'Server name'        = $s
        'ServerAvailability' = $ConStatus
        'Services'           = $svc -join '|'
    }
}