我有一个奇怪的,我没有看到太多的写作。无论如何,这里去了。
我正在尝试构建一个数组并将其导出为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管理单元。任何帮助是极大的赞赏。
答案 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
我认为这就是你想要的。