xmlファイルから情報を収集して処理しています。私が望むすべての要素を確実に得るために、私の質問はリベラルです。その結果、結果リスト($components
と呼ばれます)に重複する要素で終わる可能性があります。私は結果をSort-Object
まで実行し、次にGet-Unique
を実行してすべての一意のオブジェクトを見つけました。ユニークなオブジェクトの1つはGet-Unique
のままにしておきます。しかし、すでに一意のオブジェクト(元のリストに重複していないオブジェクト)の一部が削除されています。Powershell、Get-Unique既に一意の単一オブジェクトを吹き飛ばす
ここでは簡単な例を示します。ただ、PowerShellのにこれを貼り付けたり、PS1ファイルと実行(下に示す出力)に保存する:あなたはPowerShellのに貼り付けた場合は、その最後の行の後にEnterキーを押し
$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
。
出力は次のようなものです:component2
は完全に一度、私たちにパイプGet-Unique
に消えるか
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:\>
注意してください。誰もがこれを説明し、同一のクエリスキームを保持する修正を提供できますか?
編集:-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のテクニカル記事から - **このパラメータがなければ、データはオブジェクトとして扱われるため、同じタイプのオブジェクトのコレクションをGet-Uniqueに提出すると、ファイルのコレクションなど、1つだけが返されます(最初)** – JNK
私は運が無かった。 :/ – Vimes
私は、重複したオブジェクトが実際にメモリ内の同じオブジェクトへの2つの参照であり、比較がデフォルトで正しいと予想していると考えました。明らかに、より多くのことが起こっている。 – Vimes