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

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

最佳答案

好的,看起来数据存储区和应用程序是根据您先前的代码返回数组的唯一字段。假定$ 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

我想这就是您要寻找的。

关于powershell - Powershell-使用Export-csv为多个数组对象创建新行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21415876/

10-10 09:22
查看更多