如何移除PowerShell中PSCustomObject数组的空值列?
移除PSCustomObject数组中全为空的列
原代码问题分析
你写的判断和操作逻辑存在两个关键错误:
- 判断条件失效:
$Data.Export -NotLike $Null无法正确检测列是否全为空。$Data.Export返回的是所有Export值组成的数组('', '', ''),空字符串''和$Null是不同的值,-NotLike $Null对每个空字符串都会返回$true,导致条件误判为成立。 - 操作对象错误:
$Data是数组类型,而非单个PSCustomObject,直接对数组调用PSObject.Properties.Remove('Export')不会生效——数组本身没有这个属性,你需要遍历数组中的每个对象进行操作。
解决方案
方案1:修改原数组中的每个对象
先检查Export列是否所有值都为空(包括空字符串和$Null),如果是,遍历数组移除每个对象的该属性:
# 检查Export列是否全为空(空字符串或$Null) if (-not ($Data.Export | Where-Object { $_ })) { foreach ($item in $Data) { $item.PSObject.Properties.Remove('Export') } }
方案2:生成仅含非空列的新数组(推荐)
这种方式不修改原对象,而是通过筛选属性生成新数组,更符合PowerShell的惯用写法:
# 获取数组第一个对象的所有属性名 $allProps = $Data[0].PSObject.Properties.Name # 筛选出至少有一个非空值的属性 $keepProps = $allProps | Where-Object { $propName = $_ # 检查该属性是否存在至少一个非空值 $Data | Where-Object { $_.$propName } } # 生成只保留目标属性的新数组 $Data = $Data | Select-Object $keepProps
验证结果
运行上述任意方案后,执行$Data会输出:
RawMessage MessageType ---------- ----------- 123 String 456 File 789 String
内容的提问来源于stack exchange,提问作者Tenshiphe
相关产品推荐
相关产品推荐

