Select-Object -Unique 按 PowerShell 对象相等性规则去重:标量值按值比较,复杂对象默认按引用(无效),需用 -Property 指定属性才能基于属性值去重;如需完整对象去重,应配合 Sort-Object Name,ID | Sort-Object Name,ID -Unique。
select-object -unique 用于从管道中提取**唯一对象**,但它是否去重、如何去重,取决于对象的类型和比较方式——不是简单按“值”去重,而是按 powershell 的对象相等性规则判断。
只对简单标量值(如字符串、数字)直接生效
当管道中是纯字符串、整数等标量时,-Unique 按值比较,效果直观:
"apple", "banana", "apple", "cherry" | Select-Object -Unique # 输出: # apple # banana # cherry
这种场景下无需额外处理,直接可用。
对自定义对象或复杂对象,默认按引用去重(通常无效)
如果对象是 [PSCustomObject] 或其他类型(如 Get-Process 输出),-Unique 默认使用 .NET 引用相等性(ReferenceEquals),而每个对象都是新实例,所以即使属性完全相同,也会被当作不同对象保留:
[PSCustomObject]@{Name="A"; ID=1},
[PSCustomObject]@{Name="B"; ID=2},
[PSCustomObject]@{Name="A"; ID=1} | Select-Object -Unique
# 输出全部三行 —— 并未去重!
正确去重对象:必须配合 -Property 指定关键属性
要按对象的某些属性值去重,必须显式用 -Property 参数指定字段。PowerShell 会基于这些属性的组合值判断唯一性:
- 支持单个属性:
Select-Object -Property Name -Unique - 支持多个属性:
Select-Object -Property Name,ID -Unique - 结果默认只输出指定的属性(若需完整对象,加
-Property *或重新构造)
$data = @(
[PSCustomObject]@{Name="A"; ID=1; City="NY"},
[PSCustomObject]@{Name="B"; ID=2; City="LA"},
[PSCustomObject]@{Name="A"; ID=1; City="SF"}
)
$data | Select-Object Name,ID -Unique
# 输出(按 Name+ID 去重,仅显示这两列):
# Name ID
# ---- --
# A 1
# B 2
想保留完整对象且去重?用 Sort-Object -Unique + 原始属性排序
如果既要去重,又要返回原始对象(含所有属性),推荐组合 Sort-Object 和 -Unique(它在排序后对相邻重复项去重):
- 先按去重依据排序(如
Name,ID),再用Sort-Object -Unique - 注意:
Sort-Object -Unique只对已排序的输入稳定有效;若未排序,可能漏去重
$data | Sort-Object Name,ID | Sort-Object Name,ID -Unique # 返回完整对象,且 Name+ID 组合唯一


















