powershell - 将列添加到来自 vCenter Powershell 的现有 csv 输出
问题描述
位置 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($i in $inventory){ Connect-VIServer -Server $i.vcenter -User $i.username -Password $i.password Get-VMHost | 选择对象-属性名称、版本 | 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 }
但这不起作用
解决方案
只要您的内存可以保存所有数据,我只会写入输出 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 的连接。
$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
到整个 object ,这会将其添加到列表中具有相同值$ExistingCSV
的每个项目中。$ExistingCSV
因此,在循环结束时,CSV 的每一行都有一个Location
与循环中最后一项相匹配的值。
推荐阅读
- gitlab - 如何配置 GitLab CI config.toml 以便 output_limit 工作
- sql-server - 我如何在 microsoft sql server 中使用 distinct 函数
- reactjs - 将 JS 路由反应到具有过滤数据的相同组件
- c++ - 将 Qt 与 Visual Studio 代码一起使用 (Windows)
- php - Laravel 为 auth 和 guest 用户路由不同的控制器
- java - hibernate一对多映射中各种子表的插入顺序
- javascript - 使用 AXIOS 和 VueJs 用二维数组映射数据
- javascript - 如何在请求后保存变量的值,但在第一次加载时有不同的值?
- python - jinja2.exceptions.TemplateNotFound 为什么会不断弹出?
- javascript - 如何使用 JavaScript 替换文本的多个实例?