PowerShell:为什么 Get-Unique 只返回集合中的第一个对象?

rob*_*yaw 2 powershell

我有一系列结构如下的 JSON 文件:

{
  "start": "B",
  "end": "D",
  "display": true
}
Run Code Online (Sandbox Code Playgroud)

其内容为:

文件 start end display
1 C 真的
2 C 真的
3 D 真的
4 A 真的
5 A C 真的
6 A 真的

这些文件在 PowerShell 中解析如下:

$edges = Get-ChildItem -Filter "*.json" `
    | ForEach-Object { Get-Content $_.FullName | Out-String | ConvertFrom-Json | Select-Object @{n="start";e={$_.start}},@{n="end";e={$_.end}},@{n="display";e={$_.display}} }

# start end display
# ----- --- -------
# B     C      True
# B     C      True
# B     D      True
# A     B      True
# A     C      True
# A     B      True
Run Code Online (Sandbox Code Playgroud)

我现在想要过滤集合以仅包含唯一值;在我的场景中,顺序并不重要:

# Desired Output
#
# start end display
# ----- --- -------
# B     C      True
# B     D      True
# A     B      True
# A     C      True
Run Code Online (Sandbox Code Playgroud)

根据我对官方文档的解释,我应该在调用之前对集合进行排序Get-Unique

$edges = $edges `
    | Sort-Object -Property @{Expression = "start"; Descending = $False}, @{Expression = "end"; Descending = $False} `
    | Get-Unique
Run Code Online (Sandbox Code Playgroud)

但是,无论集合是否已排序,Get-Unique都只返回第一项:

# Unsorted:
#
# start end display
# ----- --- -------
# B     C      True

# Sorted:
#
# start end display
# ----- --- -------
# A     B      True
Run Code Online (Sandbox Code Playgroud)

我是否误解了Get-Unique工作原理?如何才能达到预期的产出?

Adm*_*ngs 8

Get-Unique有两个参数集。一种是使用-AsString参数,一种是使用-OnType参数。当自定义对象的集合通过管道传输到 时Get-Unique-OnType将使用该参数。因此,它只输出每种类型的一个对象。如果明确使用该-AsString参数,您将得到预期的结果。

# json
$json = @'
[{
  "start": "B",
  "end": "D",
  "display": true
},
{
  "start": "B",
  "end": "D",
  "display": true
},
{
  "start": "A",
  "end": "F",
  "display": false
},{
  "start": "A",
  "end": "F",
  "display": false
}
]
'@

($json | ConvertFrom-Json) | Sort-Object start,end,display | Get-Unique -AsString
Run Code Online (Sandbox Code Playgroud)

输出:

start end display
----- --- -------
A     F     False
B     D      True
Run Code Online (Sandbox Code Playgroud)

请注意,Get-Unique比较字符串时区分大小写。