将列添加到 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
值匹配循环中的最后一项。
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
值匹配循环中的最后一项。