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

问题描述 投票:0回答:1

位置vcenter用户名密码 abc 10.1 X xxx 定义 10.2 Y yyy

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

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

示例

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

输出应该如下所示

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
}

但这不起作用

powershell csv powercli
1个回答
1
投票

如果您的内存可以容纳所有

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
值。
    

© www.soinside.com 2019 - 2024. All rights reserved.