首页 > 解决方案 > 将列添加到来自 vCenter Powershell 的现有 csv 输出

问题描述

位置 vCenter 用户名密码 abc 10.1 X xxx def 10.2 Y yyy

一个 csv 文件,它的位置列是一个位置,并且在该位置 IP 列指示 vCenter IP

我需要生成所有主机详细信息并将位置字段添加为最终 csv 中的第一个字段,但无法这样做

例子

假设位置 abc 有一个包含 5 台主机的中心,而位置 def 有一个包含 3 台主机的中心

输出 shd 看起来像

位置名称 版本 abc h1 6.5 abc h2 6.5 abc h3 6.5 abc h4 6.5 abc h5 6.5 def hxx 6.7 def hyy 6.7 def hzz 6.7

$inventory = Import-Csv -path path.csv

foreach($i in $inventory){ Connect-VIServer -Server $i.vcenter -User $i.username -Password $i.password Get-VMHost | 选择对象-属性名称、版本 | Export-csv tempoutput.csv -NoTypeInformation -Append $ExistingCSV = Import-Csv -Path 'tempoutput.csv' $ExistingCSV | Add-Member -MemberType NoteProperty -Name 'Location' -Value $i.location $ExistingCSV | Export-Csv final.csv -NoTypeInformation
Disconnect-VIServer -Server $i.vcenter -Force -Confirm:$false }

但这不起作用

标签: powershellcsvpowercli

解决方案


只要您的内存可以保存所有数据,我只会写入输出 CSV Get-VMHost。您可以使用计算属性来避免必须使用临时 CSV 文件。

$inventory = Import-Csv -path path.csv

$output = foreach ($i in $inventory) {
    $null = Connect-VIServer -Server $i.vcenter -User $i.username -Password $i.password
    Get-VMHost | Select-Object -Property Name,Version,@{n='Location';e={$i.Location}}
    $null = Disconnect-VIServer -Server $i.vcenter -Force -Confirm:$false
}

$output | Export-Csv final.csv -NoType

如果您在 CSV 文件中重复输入相同的 vCenter 和凭据,则可能值得考虑重新设计。多次连接和断开同一个 vCenter 可能效率低下。您可以使用Group-Object仅在 vCenter 服务器更改时连接和断开与 vCenter 的连接。

$inventory = Import-Csv -path path.csv | Group-Object vcenter,username,password | Foreach-Object {
    $vc = $_.Group[0] | Select-Object vcenter,username,password,location
    $null = Connect-VIServer -Server $vc.vcenter -User $vc.username -Password $vc.password
    Get-VMHost | Select-Object -Property Name,Version,@{n='Location';e={$vc.Location}}
    $null = Disconnect-VIServer -Server $vc.vcenter -Force -Confirm:$false
}

$inventory | Export-Csv final.csv -NoType

$ExistingCSV在您的尝试中,您正在每次循环迭代期间读取整个临时 CSV 。然后,您将该属性添加Location到整个 object ,这会将其添加到列表中具有相同值$ExistingCSV的每个项目中。$ExistingCSV因此,在循环结束时,CSV 的每一行都有一个Location与循环中最后一项相匹配的值。


推荐阅读