You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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 " + "
    }
}

步骤说明:

  1. 遍历所有虚拟机,对每个VM获取对应的VHD信息,同时把VM名称和转换后的磁盘大小(GB单位)关联起来,存储到$vmDiskDetails中。
  2. 用Group-Object把同一个VM的所有磁盘记录归为一组。
  3. 对每个分组创建自定义对象,其中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:00:08