Powershell - 使用Export-csv为多个数组对象创建新行

时间:2014-01-28 20:16:33

标签: powershell csv vmware powershell-v3.0 powercli

我有一个奇怪的,我没有看到太多的写作。无论如何,这里去了。

我正在尝试构建一个数组并将其导出为CSV。问题是,如果返回的结果不止一个,我就无法弄清楚如何将它作为新行添加到CSV中。我目前正在使用-join将所有结果抛出到同一个单元格中,但这不是最佳的。我真正想要做的是添加一个新行,并在同一列中将额外的结果放在它下面。那有意义吗?这就是我现在所拥有的:

# Grab all VMs, put into variable
$vms = Get-VM


# Use to build report
foreach ($vm in $vms){
    New-Object PSObject -Property @{
    VMName = $vm.Name
    UsedSpaceGB = $vm.UsedSpaceGB
    StorageAllocatedGB = ($vm.HardDisks.capacitygb | Measure-Object -Sum).Sum
    NumberOfCPUs = $cm.NumCpu
    MemoryGB = $vm.MemoryGB
    Datastores = Get-Datastore -VM $vm
    Application = ($vm | Get-Annotation -CustomAttribute Applications -ErrorAction SilentlyContinue).Value | select
    } | select VMName,@{label="Application";expression={$_.Application -join ","}},UsedSpaceGB,StorageAllocatedGB,NumberOfCPUs,MemoryGB,@{l="Datastores";e={$_.Datastores -join ","}}  | Export-Csv -Path C:\script\VMCapacityUsedByApp.csv -NoClobber -Append -NoTypeInformation

} 

顺便说一下,这是使用VMware的PowerCLI管理单元。任何帮助是极大的赞赏。

1 个答案:

答案 0 :(得分:3)

好的,看起来数据存储和应用程序是根据您以前的代码返回数组的唯一字段。假设$ cm.NumCpu应该是$ vm.NumCpu,下面的代码应该做你想要的。它将确定您是否有更多数据存储或应用程序,然后循环扩展这些字段的阵列,为列出其他数据存储和应用程序的同一VM创建新记录,直到它用完记录。我将其设置为仅列出第一条记录中VM的所有详细信息,但我相信如果需要,您可以弄清楚如何更改VM。试试这段代码,看看它的样子:

# Grab all VMs, put into variable
$vms = Get-VM


# Use to build report
foreach ($vm in $vms){
    $TempVM = New-Object PSObject -Property @{
        VMName = $vm.Name
        UsedSpaceGB = $vm.UsedSpaceGB
        StorageAllocatedGB = ($vm.HardDisks.capacitygb | Measure-Object -Sum).Sum
        NumberOfCPUs = $cm.NumCpu
        MemoryGB = $vm.MemoryGB
        Datastores = Get-Datastore -VM $vm
        Application = ($vm | Get-Annotation -CustomAttribute Applications -ErrorAction SilentlyContinue).Value
    } 
    $Records = if($TempVM.Application.count -gt $TempVM.Datastores.Count){$TempVM.Application.Count}else{$TempVM.Datastores.Count}
    $ExpandedVM = @()
    $ExpandedVM += $TempVM|select Name,UsedSpaceGB,StorageAllocatedGB,NumberOfCPUs,MemoryGB,@{l="Datastores";e={$TempVM.Datastores[0]}},@{l="Application";e={$TempVM.Application[0]}}
    for($i=1;$i -lt $Records;$i++){$ExpandedVM += $TempVM|select Name,@{l="Datastores";e={$TempVM.Datastores[$i]}},@{l="Application";e={$TempVM.Application[$i]}}}
    $ExpandedVM | Export-Csv -Path C:\script\VMCapacityUsedByApp.csv -NoClobber -Append -NoTypeInformation
} 

可能有一种更优雅的方式,但至少应该对你有用。我没有要测试的VM机器,或者你使用的插件,所以我编写的数据应该与你提供的数据一致(除了数据存储区和应用程序之外的所有字段的字符串都有自己的数组字符串)并最终输出如下:

Name        UsedSpaceGB StorageAllo NumberOfCP MemoryGB   Datastores Applicatio
                        catedGB     Us                               n         
----        ----------- ----------- ---------- --------   ---------- ----------
TestVM      250         500         4          16         Store1     Word      
TestVM                                                    Store2     Excel     
TestVM                                                    Store3     Access    
TestVM                                                               Outlook   
TestVM2     487         500         4          32         StoreA     WoW       
TestVM2                                                   StoreB     SC2       
TestVM2                                                   StoreC     D3        
TestVM2                                                   StoreD               
TestVM2                                                   StoreE               

我认为这就是你想要的。