get-unique仅对已排序输入有效,执行相邻去重;默认区分大小写;可用-ontype按.net类型去重;文本处理需先sort-object再get-unique。
get-unique 不能直接去重任意列表,它只对**已排序的输入**有效——这是最关键的限制,也是新手最容易出错的地方。
必须先排序,再用 Get-Unique
PowerShell 的 Get-Unique 是“相邻去重”:它只比较当前项和下一项,发现相同时跳过后者。如果重复项不挨着,就会被漏掉。
- 错误写法(无排序):
1,2,2,3,2 | Get-Unique→ 输出1,2,3,2(末尾的 2 没被去掉) - 正确写法:
1,2,2,3,2 | Sort-Object | Get-Unique→ 输出1,2,3
区分大小写与忽略大小写
默认区分大小写,“Apple” 和 “apple” 被视为不同项。
- 保留默认(区分):
"Apple","apple","Banana" | Sort-Object | Get-Unique→ 返回全部三项 - 忽略大小写:
"Apple","apple","Banana" | Sort-Object -CaseSensitive:$false | Get-Unique -CaseInsensitive - 更常用写法(统一转小写再处理):
"Apple","apple","Banana" | ForEach-Object { $_.ToLower() } | Sort-Object | Get-Unique
按对象类型去重(-OnType)
当管道中混有多种类型对象(如文件和文件夹),想每种类型只留一个示例,用 -OnType 参数:
-
Get-ChildItem | Get-Unique -OnType→ 可能返回一个DirectoryInfo和一个FileInfo,其余同类型对象被跳过 - 注意:它不关心内容或属性值,只看 .NET 类型名(如
System.IO.DirectoryInfo)
文本文件去重的典型流程
比如清理日志中的重复行,或提取唯一关键词:
- 读取并去重所有行:
Get-Content log.txt | Sort-Object | Get-Unique - 提取单词再去重(忽略大小写):
(Get-Content file.txt | ForEach-Object { $_.Split() }) | ForEach-Object { $_.Trim() } | Where-Object { $_ } | Sort-Object -CaseSensitive:$false | Get-Unique -CaseInsensitive - 统计唯一项数量:
$unique = Get-Content data.csv | Sort-Object | Get-Unique; $unique.Count











