如何筛选PowerShell对象数组指定属性并按哈希表重命名属性名
PowerShell 对象属性筛选与重命名实现
现有包含 p1、p2、p3、p4 属性的PSCustomObject数组:
$objectArray = [PSCustomObject]@{ p1 = "Value1"; p2 = "Value2"; p3 = "Value3"; p4 = "Value4" },[PSCustomObject]@{ p1 = "Value5"; p2 = "Value6"; p3 = "Value7"; p4 = "Value8" }
同时存在属性名映射哈希表:
$propertyReplacements = @{ "p1" = "x1" "p2" = "y1" }
需求:仅保留哈希表键中存在的属性,并将这些属性名重命名为哈希表对应的值,预期结果如下:
[PSCustomObject]@{ x1 = "Value1"; y1 = "Value2"; },[PSCustomObject]@{ x1 = "Value5"; y1 = "Value6"; }
已完成部分筛选代码,需补充完整实现逻辑:
$objectArray | select -Property @($propertyReplacements.Keys) | ....
完整实现代码
$objectArray | Select-Object -Property @( $propertyReplacements.GetEnumerator() | ForEach-Object { @{ Name = $_.Value; Expression = [scriptblock]::Create("`$_.$($_.Key)") } } )
逻辑说明
- 遍历
$propertyReplacements哈希表的键值对(通过GetEnumerator()) - 为每个键值对创建一个属性选择哈希表:
Name指定重命名后的属性名(哈希表的值)Expression是脚本块,用于从原对象中获取对应键的属性值
- 将这些属性选择哈希表组成数组,传给
Select-Object的-Property参数,一次性完成筛选与重命名
简洁写法
利用PowerShell的参数缩写(n 对应 Name,e 对应 Expression),可以简化代码:
$objectArray | Select-Object -Property ($propertyReplacements.Keys | ForEach-Object { @{ n = $propertyReplacements[$_]; e = [scriptblock]::Create("`$_.$_") } })
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

