我從XML文件收集信息並對其進行處理。我的查詢是自由的,以確保我得到我想要的所有可能的元素。因此,結果列表中可能會出現重複元素(稱爲$components
)。我通過Sort-Object
運行結果,然後運行Get-Unique
來查找所有唯一對象。根據我的理解,每個獨特對象中的一個應該由Get-Unique
保留。但它消除了一些已經唯一的對象(在原始列表中沒有重複的對象)。Powershell,獲取唯一性吹走已經唯一的單個對象
這裏是一個簡化的例子。只需粘貼到這個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的,打的最後一行後進入。
輸出是這樣的:
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:\>
注意如何component2
完全消失,一旦我們管Get-Unique
。任何人都可以解釋這一點,並提供一個解決方案,保持查詢方案大致相同?
編輯:我認爲它會使用-eq
運算符來查看元素是否是對內存中同一對象的引用。如果我手動嘗試-eq
它顯示正確的對象是相等的。但Get-Unique似乎在做別的事情。如果您將此代碼添加到上面的腳本結束它顯示了對象equivelance:
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
嘗試'-asstring'參數。從Get-Unique的Technet文章 - **如果沒有此參數,數據將被視爲一個對象,因此,當您將相同類型的對象集合提交給Get-Unique(如文件集合)時,它將返回一個(第一次)** – JNK
我試過了,沒有運氣。 :/ – Vimes
我認爲重複的對象實際上是對內存中同一對象的兩個引用,並且預期比較在默認情況下是正確的。顯然還有更多事情要做。 – Vimes