我正在从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)
你可以使用的-unique旗帜sort-object.这给了我预期的结果:
$components | Sort-Object -Property 'Id' -Unique
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2744 次 |
| 最近记录: |