从vcenter powershell向现有csv输出添加列

5cnsuln7  于 2023-10-13  发布在  Shell
关注(0)|答案(1)|浏览(109)

location vcenter用户名密码abc 10. 1 X xxx def 10. 2 Y yyy
一个csv文件,其位置列是一个位置,在该位置IP列中指示vCenter IP
我需要生成所有主机的详细信息,并添加位置字段作为最终的CSV中的第一个字段,但不能这样做
例如
假设位置abc的vCenter包含5台主机,位置def的vCenter包含3台主机
输出应如下所示

location    name    version
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 | Select-Object -Property Name,Version | 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
}

但这是行不通的

piv4azn7

piv4azn71#

我只会写一次输出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和断开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值,与循环中的最后一项匹配。

相关问题