微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在从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

如果您粘贴到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:\>

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

编辑:我假设它将使用-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]))

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

0: component1
1: component2
2: component1
0 vs 1: False
0 vs 2: True
1 vs 2: False

解决方法

您可以使用sort-object的-unique标志.这给了我预期的结果:

$components | sort-object -Property 'Id' -Unique

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐