2010-12-23 19 views

Respuesta

4

No hay una manera que yo sepa, excepto escribir una función para comparar el valor de cada clave (potencialmente recursivo si el valor es algo distinto de un objeto primitivo). Sin embargo, las matrices asociadas en PowerShell son solo tipos .NET (System.Collections.Hashtable). Es posible que desee abrir esta pregunta a la audiencia .NET más amplia agregando la etiqueta .NET a su pregunta.

3

simplemente para la corrección, aquí es una simple función de tablas hash que comparan:

function Compare-Hashtable(
    [Hashtable]$ReferenceObject, 
    [Hashtable]$DifferenceObject, 
    [switch]$IncludeEqual 
) { 
    # Creates a result object. 
    function result([string]$side) { 
    New-Object PSObject -Property @{ 
     'InputPath'= "$path$key"; 
     'SideIndicator' = $side; 
     'ReferenceValue' = $refValue; 
     'DifferenceValue' = $difValue; 
    } 
    } 

    # Recursively compares two hashtables. 
    function core([string]$path, [Hashtable]$ref, [Hashtable]$dif) { 
    # Hold on to keys from the other object that are not in the reference. 
    $nonrefKeys = New-Object 'System.Collections.Generic.HashSet[string]' 
    $dif.Keys | foreach { [void]$nonrefKeys.Add($_) } 

    # Test each key in the reference with that in the other object. 
    foreach($key in $ref.Keys) { 
     [void]$nonrefKeys.Remove($key) 
     $refValue = $ref.$key 
     $difValue = $dif.$key 

     if(-not $dif.ContainsKey($key)) { 
     result '<=' 
     } 
     elseif($refValue -is [hashtable] -and $difValue -is [hashtable]) { 
     core "$path$key." $refValue $difValue 
     } 
     elseif($refValue -ne $difValue) { 
     result '<>' 
     } 
     elseif($IncludeEqual) { 
     result '==' 
     } 
    } 

    # Show all keys in the other object not in the reference. 
    $refValue = $null 
    foreach($key in $nonrefKeys) { 
     $difValue = $dif.$key 
     result '=>' 
    } 
    } 

    core '' $ReferenceObject $DifferenceObject 
} 

Algunos salida de ejemplo:

> $a = @{ 'same'='x'; 'shared'[email protected]{ 'same'='x'; 'different'='unlike'; 'new'='A' } } 
> $b = @{ 'same'='x'; 'shared'[email protected]{ 'same'='x'; 'different'='contrary' }; 'new'='B' } 
> Compare-Hashtable $a $b 

InputPath   ReferenceValue DifferenceValue SideIndicator 
---------   -------------- --------------- ------------- 
shared.different unlike   contrary   <> 
shared.new   A         <= 
new         B    => 
Cuestiones relacionadas