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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:27:42