2

我有一个奇怪的,我没有看到太多的写作。不管怎样,就到这里吧。

我正在尝试构建一个数组并将其导出为 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 管理单元。任何帮助是极大的赞赏。

4

1 回答 1

3

好的,看起来数据存储和应用程序是根据您之前的代码返回数组的唯一字段。假设 $cm.NumCpu 应该是 $vm.NumCpu 下面的代码应该做你想要的。它将确定您是否有更多的数据存储或应用程序,然后循环扩展这些字段的数组,为同一 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               

我想这就是你要找的。

于 2014-01-28T23:39:21.190 回答