2014-01-30 27 views
0

我想比較兩個數組和下面的代碼不起作用:爲什麼在使用PowerShell比較對象比較兩個數組時需要更改數據類型?

$cluster="MyCluster" 
foreach ($cluster in $clusters) 
{$allnodes+=gwmi -q "Select Name from MSCluster_Node" -namespace root\mscluster -  ComputerName $cluster -Authentication PacketPrivacy|Select-Object @ {Name="Node";Expression={$_.Name}} 
}}}} 

foreach ($cluster in $clusters) 
{ 
$actnodes+=gwmi -class "MSCluster_Resource" -namespace "root\mscluster" -computername $cluster -Authentication PacketPrivacy | where {$_.type -eq "SQL Server"} | Select @{n='ServerInstance';e={("{0}\{1}" -f $_.PrivateProperties.VirtualServerName,$_.PrivateProperties.InstanceName).TrimEnd('\')}}, @{n='Node';e={$(gwmi -Authentication PacketPrivacy -ComputerName $cluster -Namespace "root\mscluster" -query "ASSOCIATORS OF {MSCluster_Resource.Name='$($_.Name)'} WHERE AssocClass = MSCluster_NodeToActiveResource" | Select -ExpandProperty Name)}}|Select "Node" 
} 

$passivenodes=Compare-Object -ReferenceObject($allnodes) -DifferenceObject($actnodes) 
$passivenodes 

上面的代碼返回錯誤的結果。

但是,如果我改變的數據類型爲字符串是這樣的:

$allnodes = [string[]]$allnodes|select -unique 
$actnodes = [string[]]$actnodes|select -unique 

然後它根據需要。

但是,在http://technet.microsoft.com/en-us/library/hh849941(v=wps.620).aspx它說

輸入輸入類型是可以通過管道到 此cmdlet的對象的類型。

•System.Management.Automation.PSObject可以通過管道 DifferenceObject對象比較 - 對象

爲什麼我不能用比較不改變數據類型?哪裏不對?

+0

你運行了'$ allnodes | gm'來查看對象類型是什麼?你有沒有考慮過像'$ actnodes + =(gwmi blah,blah,blah).ToString()'或其他什麼的字符串來提取數據? – TheMadTechnician

回答

0

雖然可以在對象的任意數組傳遞,你應該告訴對象的Compare-Object的屬性要使用-Property參數可以採取的一個或多個屬性名稱比較比較。執行$allnodes | get-member以查看要比較哪些屬性。