如何使用PowerShell序列化哈希表/数组列表并合并磁盘大小输出
解决PowerShell中合并同一VM磁盘大小输出的问题
你已经离目标很近啦!问题出在你原来的脚本是逐个输出每个磁盘的条目,而-join需要先把同一个VM的所有磁盘大小收集到一个集合里再合并。这里有两种实用的方法来实现你想要的输出格式:
方法一:先收集所有磁盘信息再分组合并
# 先收集每个VM的所有磁盘信息,包含VM名称和磁盘大小(GB,保留1位小数) $vmDiskDetails = Get-VM | ForEach-Object { $currentVM = $_ $currentVM.VMId | Get-VHD | Select-Object ` @{Name="Name"; Expression={$currentVM.Name}}, @{Name="DiskSizeGB"; Expression={[math]::Round($_.Size/1GB,1)}} } # 按VM名称分组,然后合并每个组的磁盘大小 $vmDiskDetails | Group-Object -Property Name | ForEach-Object { [PSCustomObject]@{ Name = $_.Name Disks = $_.Group.DiskSizeGB -join " + " } }
步骤说明:
- 遍历所有虚拟机,对每个VM获取对应的VHD信息,同时把VM名称和转换后的磁盘大小(GB单位)关联起来,存储到
$vmDiskDetails中。 - 用
Group-Object把同一个VM的所有磁盘记录归为一组。 - 对每个分组创建自定义对象,其中
Disks字段通过-join " + "把该VM的所有磁盘大小拼接成你想要的格式。
方法二:直接对单个VM处理(更简洁)
如果不想先收集所有数据,也可以直接在遍历每个VM的时候就合并磁盘大小:
Get-VM | ForEach-Object { $currentVM = $_ # 获取当前VM的所有磁盘大小,转换为GB并保留1位小数,然后用" + "连接 $combinedDisks = ($currentVM.VMId | Get-VHD | ForEach-Object { [math]::Round($_.Size/1GB,1) }) -join " + " # 输出合并后的结果对象 [PSCustomObject]@{ Name = $currentVM.Name Disks = $combinedDisks } }
为什么你之前的-join没生效?
你原来的脚本是针对每个VHD输出一条独立记录,-join没法直接作用在这种逐条输出的场景下。必须先把同一个VM的所有磁盘大小值收集到一个数组里,再对这个数组使用-join拼接字符串,才能得到合并后的结果。
内容的提问来源于stack exchange,提问作者D. Liljegren
相关产品推荐
相关产品推荐

