Powershell,Get-Unique吹走已经独特的单一物品

Vim*_*mes 3 powershell

我正在从xml文件中收集信息并进行处理.我的查询是自由的,以确保我得到我想要的所有可能的元素.因此,最终可能会在结果列表中显示重复元素(称为$components).我运行结果Sort-Object然后Get-Unique找到所有唯一对象.据我所知,应该留下每个独特对象中的一个Get-Unique.但它消除了一些已经很独特的对象(原始列表中没有重复的对象).

这是一个简化的例子.只需将其粘贴到PowerShell中或保存到ps1文件并运行(输出如下所示):

$xmlDoc = [xml]@'
<root>
    <component Id='component1'>
        <regkey Id='regkey1'/>
    </component>
    <component Id='component2'>
        <file Id='file1' />
    </component>
</root>
'@

$files = $xmlDoc.SelectNodes("//file[@Id='file1']")
$regkeys = $xmlDoc.SelectNodes("//regkey[@Id='regkey1']")
$components = $xmlDoc.SelectNodes("//component[@Id='component1'] | //component[@Id='component2']")
$components += $regkeys | Select-Object -ExpandProperty 'ParentNode'
$components | Sort-Object -Property 'Id'
Write-Host
$components | Sort-Object -Property 'Id' | Get-Unique
Run Code Online (Sandbox Code Playgroud)

如果您粘贴到PowerShell中,请在最后一行之后按Enter键.

输出是这样的:

PS C:\> $xmlDoc = [xml]@'
>> <root>
>>     <component Id='component1'>
>>         <regkey Id='regkey1'/>
>>     </component>
>>     <component Id='component2'>
>>         <file Id='file1' />
>>     </component>
>> </root>
>> '@
>>
PS C:\> $files = $xmlDoc.SelectNodes("//file[@Id='file1']")
PS C:\> $regkeys = $xmlDoc.SelectNodes("//regkey[@Id='regkey1']")
PS C:\> $components = $xmlDoc.SelectNodes("//component[@Id='component1'] | //component[@Id='component2
']")
PS C:\> $components += $regkeys | Select-Object -ExpandProperty 'ParentNode'
PS C:\> $components | Sort-Object -Property 'Id'

Id                                                 regkey
--                                                 ------
component1                                         regkey
component1                                         regkey
component2


PS C:\> Write-Host

PS C:\> $components | Sort-Object -Property 'Id' | Get-Unique

Id                                                 regkey
--                                                 ------
component1                                         regkey


PS C:\>
Run Code Online (Sandbox Code Playgroud)

注意component2一旦我们管道,它们将如何完全消失Get-Unique.任何人都可以解释这个并提供一个修复程序,使查询方案保持不变吗?

编辑:我假设它将使用-eq运算符来查看元素是否是对内存中同一对象的引用.如果我手动尝试-eq它显示正确的对象是相同的.但Get-Unique似乎在做其他事情.如果将此代码添加到上述脚本的末尾,则显示对象等效:

Write-Host
Write-Host "0: $($components[0].Id)"
Write-Host "1: $($components[1].Id)"
Write-Host "2: $($components[2].Id)"
Write-Host ("0 vs 1: " + ($components[0] -eq $components[1]))
Write-Host ("0 vs 2: " + ($components[0] -eq $components[2]))
Write-Host ("1 vs 2: " + ($components[1] -eq $components[2]))
Run Code Online (Sandbox Code Playgroud)

输出(从脚本文件运行时):

0: component1
1: component2
2: component1
0 vs 1: False
0 vs 2: True
1 vs 2: False
Run Code Online (Sandbox Code Playgroud)

man*_*lds 5

你可以使用的-unique旗帜sort-object.这给了我预期的结果:

$components | Sort-Object -Property 'Id' -Unique
Run Code Online (Sandbox Code Playgroud)