在使用PowerShell Compare-Object比较两个数组时,为什么需要更改数据类型?

时间:2014-01-30 10:34:27

标签: arrays powershell compare

我正在尝试比较两个数组,以下代码不起作用:

$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对象到Compare-Object

为什么我不能在不改变数据类型的情况下使用compare?怎么了?

1 个答案:

答案 0 :(得分:0)

虽然您可以传入任意数组的对象,但您可能应该使用Compare-Object参数告诉-Property您要比较的对象的哪些属性,该参数可以取一个或多个属性的名称比较。执行$allnodes | get-member以查看要比较的属性。