【问题标题】:Using Export-Csv使用导出 CSV
【发布时间】:2018-04-10 09:23:13
【问题描述】:

我在为我的脚本正确设置格式时遇到了一些问题。我正在尝试将 powercli 与 VMware 一起使用,以从 vApp 中提取主机名和 IP 信息并将其导出为 CSV。

到目前为止,我有:

$vapp = Get-CIVApp -name name_of_vApp
$vms = $vapp.ExtensionData.Children.vm
$output = foreach ($vm in $vms) {$vm | select-object -Property Name;$vm.Section[2].NetworkConnection | select-object -Property IpAddress,ExternalIpAddress;} 
$output | export-csv -Path c:\temp\test.csv -NoTypeInformation

问题似乎是我为$output 赋值的那一行。出于某种原因,它不会添加 IP 信息,即使它在函数之外工作,甚至在没有 $vm.name 的函数内部也有效。它只是给了我用空行分隔的机器名称,等于服务器拥有的 IP 地址数。

我的最终目标是拥有一个包含服务器名称、内部 IP 地址和外部 IP 地址的三列表。任何帮助,将不胜感激。

提前致谢。

【问题讨论】:

    标签: powershell csv export-to-csv powercli


    【解决方案1】:

    我认为问题可能是因为您在每次迭代中输出两个对象而不是一个对象。当您将单个对象返回到管道时,PowerShell 通常效果最佳。在这种情况下,您可以通过使用带有属性哈希表的 [pscustomobject] 类型来执行此操作。

    我也认为使用ForEach-Object 而不是ForEach 是有意义的,因为您可以将输出直接通过管道传输到Export-CSV

    $vapp = Get-CIVApp -name name_of_vApp
    $vms = $vapp.ExtensionData.Children.vm
    
    $vms | ForEach-Object {
        [pscustomobject]@{
            Name = $_.name
            IpAddress = ($_.Section[2].NetworkConnection.IpAddress)
            ExternalIpAddress = ($_.Section[2].NetworkConnection.ExternalIpAddress)
        }
    } | Export-CSV -Path c:\temp\test.csv -NoTypeInformation 
    

    请注意,我不知道您收集 IPAddress 和 ExternalIPAddress 属性的方式在这里是否一定有效,并且目前没有地方可以测试这部分。

    【讨论】:

    • 谢谢。我不知道PSCustomObject,但它似乎是很多事情的好工具。我也混淆了ForEach 作为ForEach-Object 的别名。非常混乱!
    • 我能够测试并且做到了。当虚拟机有多个 IP 地址时,powershell 返回System.Object[] 时遇到了一点问题。我可以通过使用-join 解决这个问题,就像这样:IpAddress = (($_.Section[2].NetworkConnection.IpAddress) -join ',')
    【解决方案2】:

    问题在于,在第二个 Select 之后,您仍在使用(过滤的)$vm 对象,而 不是 $vm.secton[2],先试试$vm | Flatten-Object

    【讨论】:

    • 我不知道 Flatten-Object。这在未来会很有用,因为我一直在努力从 powershell 中导出信息。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2015-07-26
    • 2018-07-15
    • 1970-01-01
    相关资源
    最近更新 更多