PowerShell分组在v4与v5表现不同,如何实现结果一致?
如何让PowerShell 4.0和5.1中按SiteCode分组哈希数组得到相同结果?
我之前也碰到过PowerShell版本间Group-Object的行为差异问题,刚好能帮你解决这个兼容问题。下面给你两个可靠的方案,都能在两个版本中得到一致的分组效果:
方案1:手动实现分组(最稳妥,无版本依赖)
直接遍历数据集手动构建分组哈希表,完全避开Group-Object的版本差异:
$groupedDataset = @{} # 遍历每个哈希表项 foreach ($item in $dataset) { $siteCode = $item.SiteCode # 如果当前SiteCode还没作为键存在,初始化空数组 if (-not $groupedDataset.ContainsKey($siteCode)) { $groupedDataset[$siteCode] = @() } # 将当前项添加到对应分组 $groupedDataset[$siteCode] += $item }
这个写法逻辑简单直接,在PS4.0和5.1中执行后,都会得到你预期的分组结果:
Name Value ---- ----- x1113 {@{SiteCode=x1113; Program=x; AppointmentId=1234567893; ...}} x1111 {@{SiteCode=x1111; Program=x; AppointmentId=1234567891; ...}, @{SiteCode=x1111; Program=x; AppointmentId=1234567894; ...}} x1112 {@{SiteCode=x1112; Program=x; AppointmentId=1234567892; ...}}
方案2:兼容版本的Group-Object写法
如果你更习惯用Group-Object,可以改用脚本块指定分组属性的方式,替代直接写属性名,这样能兼容两个版本:
$groupedDataset = @{} $dataset | Group-Object -Property { $_.SiteCode } | ForEach-Object { $groupedDataset[$_.Name] = $_.Group }
为什么原来的写法在PS4.0失效?
你之前先把哈希表转成PSCustomObject再分组,在PS5.1中没问题,但PS4.0的Group-Object在处理这种转换后的自定义对象时,对属性的解析逻辑有差异,导致无法正确识别SiteCode的值进行分组,最终所有项都被归到了一个默认组里,才会出现你看到的异常结果。而用脚本块直接提取哈希表的SiteCode值,能绕过这个版本差异。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

