将列添加到 vcenter powershell 的现有 csv 输出

Adding column to existing csv output from vcenter powershell

location 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($inventory 中的 $i){ Connect-VIServer -服务器 $i.vcenter -用户 $i.username -密码 $i.password 获取 VMHost | Select-对象-属性名称,版本|导出-csv tempoutput.csv -NoTypeInformation -Append $ExistingCSV = Import-Csv -Path 'tempoutput.csv' $现有CSV |添加成员 -MemberType Note属性 -Name 'Location' -Value $i.location $现有CSV |导出 Csv final.csv -NoTypeInformation
断开-VIServer -Server $i.vcenter -Force -Confirm:$false }

但这不起作用

如果您的内存可以容纳所有 Get-VMHost 数据,我只会写入输出 CSV。您可以使用计算属性来避免必须使用临时 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 添加到整个对象 $ExistingCSV,这会将其添加到 $ExistingCSV 列表中具有相同值的每个项目。所以在循环结束时,CSV 的每一行都有一个 Location 值匹配循环中的最后一项。