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
}
但这是行不通的
1条答案
按热度按时间piv4azn71#
我只会写一次输出CSV,只要你的内存可以容纳所有的
Get-VMHost
数据。您可以使用计算属性来避免使用临时CSV文件。如果您在CSV文件中重复输入了相同的vCenter和凭据,则值得考虑重新设计 *。多次连接和断开连接到同一vCenter可能效率低下。您可以使用
Group-Object
仅在vCenter服务器更改时连接vCenter和断开vCenter。在您的尝试中,您在每次循环迭代期间阅读
$ExistingCSV
中的整个临时CSV。然后将属性Location
添加到整个对象$ExistingCSV
,这将它添加到$ExistingCSV
列表中具有相同值的每个项。因此,在循环结束时,CSV的每一行都有一个Location
值,与循环中的最后一项匹配。