位置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
}
但这不起作用
如果您的内存可以容纳所有
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
值。