PowerShell中Where-Object改变PSObject类型为PSCustomObject的解决办法
问题描述
使用Where-Object过滤PowerShell数组后,对象类型从原有的Object[]变为了PSCustomObject,需要保持过滤后的类型与原类型一致。
示例代码
$test=@() $new = New-Object PSObject $new | Add-Member -type NoteProperty -name name -Value 'test' $new | Add-Member -type NoteProperty -name nummer -Value "17580-10" $new | Add-Member -type NoteProperty -name datum -Value "10.08.23" $test += $new $test $test_filtered=@() $test_filtered=$test | Where-Object {($_.nummer -match '175')}
输出结果
PS C:\Users\cm> $test.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array PS C:\Users\cm> $test_filtered.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False PSCustomObject System.Object
问题原因
当Where-Object过滤后仅返回单个元素时,PowerShell会自动“解包”数组,直接返回单个对象而非数组;只有当结果包含多个元素时,才会保留数组类型。
解决方案
1. 使用数组子表达式@(...)强制返回数组
用@(...)包裹过滤逻辑,无论结果包含0、1还是多个元素,都会返回Object[]类型:
$test_filtered = @($test | Where-Object { $_.nummer -match '175' })
2. 使用-as运算符转换为数组类型
通过类型转换运算符将结果强制转为[object[]]:
$test_filtered = ($test | Where-Object { $_.nummer -match '175' }) -as [object[]]
验证结果
执行以下命令查看类型:
$test_filtered.GetType()
输出会显示类型为Object[],与原数组类型一致。
内容的提问来源于stack exchange,提问作者christoph.mue
相关产品推荐
相关产品推荐

