2017-08-09 53 views
3

我在PowerShell来阵列的对象。每个数组都包含一个对象数组。这些对象有两个属性:如何找到,如果Powershell的Array包含其他阵列

名称:字符串
编号:GUID

第一阵列中有4413点的对象,第二个4405的计数是无关紧要的,但我只提到它们要注意的是Array1和Array2的内容是不同的。

这里是我当前的代码(伪):

#Fill Array1 
$Array1 = Fill-Array1 

#Fill Array2 
$Array2 = Fill-Array2 

#Loop through the arrays and write out the names of all items in Array2 that are different than Array1 
ForEach($Val in $Array2) 
{ 
    $Name = $Val.Name 

    If($Array1 -notcontains $Val) //this does not work 
    { 
     Write-Host $Name 
    } 
} 

什么是您在数组1对象存在的正确方法是什么?我唯一的选择是做一个嵌套循环吗?

更新,使用从下面Manu P答案,以下是我是如何实现的解决方案:

#Fill Array1 
    $Array1 = Fill-Array1 

    #Fill Array2 
    $Array2 = Fill-Array2 

    #Compare the arrays 
    $ComparedResults = Compare-Object -ReferenceObject $Array1 -DifferenceObject $Array2 #I left out the -IncludeEqual param because I don't care about those results 

    ForEach($Result in $ComparedResults) 
    { 
     If($Result.SideIndicator -eq "=>") #the value in Array2 is different than Array1 
     { 
      $Val = $Result.InputObject 

      Write-Host $Val.Name    
     }   
    } 
+1

当我使用2个阵列与他们只是一些随机数此完全相同的方法,它完美的作品。也许它与数组中的对象类型有关? – cet51

+2

@CoryEtmund谷歌“参考平等VS价值平等” :-) –

回答

1

由于GUID是可比的,你可以简单的(内部)使用此处描述的功能加入阵列:https://stackoverflow.com/a/45483110/1701026

$Array1 = @(
    [pscustomobject]@{Name = "a"; Id = [guid]::NewGuid()} 
    [pscustomobject]@{Name = "b"; Id = [guid]::NewGuid()} 
    [pscustomobject]@{Name = "c"; Id = [guid]"de5e32c6-5338-4287-8c21-2dd5957cfffe"} 
    [pscustomobject]@{Name = "d"; Id = [guid]"345f9ac2-86a0-4b01-b843-5f4bd55f5e21"} 
    [pscustomobject]@{Name = "e"; Id = [guid]"953c1442-ed51-445e-a8f5-687120d98f83"} 
    [pscustomobject]@{Name = "f"; Id = [guid]::NewGuid()} 
) 

$Array2 = @(
    [pscustomobject]@{Name = "b"; Id = [guid]::NewGuid()} 
    [pscustomobject]@{Name = "c"; Id = [guid]"345f9ac2-86a0-4b01-b843-5f4bd55f5e21"} 
    [pscustomobject]@{Name = "d"; Id = [guid]"345f9ac2-86a0-4b01-b843-5f4bd55f5e21"} 
    [pscustomobject]@{Name = "e"; Id = [guid]"953c1442-ed51-445e-a8f5-687120d98f83"} 
    [pscustomobject]@{Name = "f"; Id = [guid]"953c1442-ed51-445e-a8f5-687120d98f83"} 
    [pscustomobject]@{Name = "g"; Id = [guid]::NewGuid()} 
) 

$Array1 | InnerJoin $Array2 -Using Name,Id | Format-Table 

结果:

Id         Name 
--         ---- 
345f9ac2-86a0-4b01-b843-5f4bd55f5e21 d 
953c1442-ed51-445e-a8f5-687120d98f83 e 

要获得所有记录具有相同的名称,其中编号为不等于:

$Array1 | InnerJoin $Array2 -on {$Left.Name -eq $Right.Name -and $Left.Id -ne $Right.Id} -Merge @{Name = {$Left.$_}} | Format-Table 

结果:

Id                   Name 
--                   ---- 
{3b175777-e88f-4248-965b-51dec8639fd6, a43d68de-9ed5-4a13-8f8e-61c6cc501458} b 
{de5e32c6-5338-4287-8c21-2dd5957cfffe, 345f9ac2-86a0-4b01-b843-5f4bd55f5e21} c 
{2a8c4bf7-cf3a-4c3d-b27b-ecb6f4a4fa43, 953c1442-ed51-445e-a8f5-687120d98f83} f 
+0

这是一个非常不错的主意,但它给我的等值时,我想的是不同的。 – crackedcornjimmy

相关问题