比较多维数组中的多个对象

时间:2019-02-15 17:04:26

标签: powershell

我已经为此战斗了两个星期。基本上,我想比较2个多维数组中的数据。

这是我的第一个数组:

$images = @(Get-ContentLibraryItem |
Select-Object Name, @{n='NameParts'; e={$_.Name -split '-',3}}  |
Select-Object Name, @{n='BaseName'; e={$_.NameParts[0]}},
@{n='Version'; e={[version]$_.NameParts[1]}})

输出看起来像这样:

Name                           BaseName               Version
----                           --------               -------
sles11sp4_jeos-1234567890      sles11sp4_jeos
sles12sp3-0.0.11               sles12sp3              0.0.11
win2012r2std_desk-0.1.23       win2012r2std_desk      0.1.23
win2012r2std_desk-0.2.34       win2012r2std_desk      0.2.34
win2016std_desk-0.3.45         win2016std_desk        0.3.45
win2016std_desk-0.4.56         win2016std_desk        0.3.33

这是我的第二个数组:

$templates = @(get-template |
Select-Object Name, @{n='NameParts'; e={$_.Name -split '-',3}}  |
Select-Object Name, @{n='BaseName'; e={$_.NameParts[0]}},
@{n='Version'; e={[version]$_.NameParts[1]}})

输出看起来像这样:

Name                                            BaseName               Version
----                                            --------               -------
sles12sp3-0.0.11-infra-dr01                     sles12sp3           0.0.11
win2016std_desk-0.3.33-infra-dr01               win2016std_desk     0.3.33
win2016std_desk-0.3.42-infra-dr01               win2016std_desk     0.3.42
win2012r2std_desk-0.1.23-infra-dr01             win2012r2std_desk   0.1.23
win2012r2std_desk-0.2.22-infra-dr01             win2012r2std_desk   0.2.22
sles12sp3-0.0.31-infra-dr01                     sles12sp3           0.0.31
win2016std_desk-0.3.45-infra-dr01               win2016std_desk     0.3.45
win2012r2std_desk-0.2.34-infra-dr01             win2012r2std_desk   0.2.34
sles11sp4_jeos-1234567890-infra-dr01            sles11sp4_jeos
sles12sp3-0.0.11-oracle01                       sles12sp3           0.0.11
sles12sp3-0.0.31-oracle01                       sles12sp3           0.0.31
sles11sp4_jeos-1234567890-oracle01              sles11sp4_jeos
sles12sp3-0.0.11-stnd-linux01                   sles12sp3           0.0.11
win2016std_desk-0.3.33-stnd-win01               win2016std_desk     0.3.33
win2016std_desk-0.3.33-stnd-sql01               win2016std_desk     0.3.33
win2016std_desk-0.4.56-stnd-win01               win2016std_desk     0.4.56
win2012r2std_desk-0.1.23-stnd-win01             win2012r2std_desk   0.1.23
sles12sp3-0.1.22-stnd-linux01                   sles12sp3           0.1.22
win2016std_desk-0.3.45-stnd-sql01               win2016std_desk     0.3.45
win2012r2std_desk-0.2.22-stnd-win01             win2012r2std_desk   0.2.22
sles12sp3-0.1.33-stnd-linux01                   sles12sp3           0.1.33
win2016std_desk-0.3.42-stnd-win01               win2016std_desk     0.3.42

在一天结束时,我正在寻找$templates$template.basename -eq $image.basename的所有$template.version -eq $image.version并删除其他所有内容。我遇到的问题是,如果我在foreach循环中一次比较它们一次,它们最终将删除所有模板。如何将数组比较在一起,以便可以在新数组中获得所有“好”模板或所有“坏”模板。

这是我的代码的最后一次迭代(该代码无效...没有删除任何内容)。

Foreach ($image in $images){
    Foreach ($template in $templates){
        if ($template |where-object {$_.basename -eq $image.basename -and $_.version -eq $image.version}){
            Write-host "Template Name Matches, next"
        }
            Else {
                Write-host "Image and version do not match, deleting"  
                Write-log -Message "Remove-template -template $($template.name) -DeletePermanently"
            }
    }

}

这是有效的最终代码!注意:我需要添加一个switch命令将删除的内容导出到csv,如果switch为true,它将执行删除操作。

$images = @(Get-ContentLibraryItem |
Select-Object Name, @{n='NameParts'; e={$_.Name -split '-',3}}  |
Select-Object Name, @{n='BaseName'; e={$_.NameParts[0]}},
  @{n='Version'; e={[version]$_.NameParts[1]}})

$templates = @(get-template |
Select-Object Name, @{n='NameParts'; e={$_.Name -split '-',3}}  |
Select-Object Name, @{n='BaseName'; e={$_.NameParts[0]}},
  @{n='Version'; e={[version]$_.NameParts[1]}})

$goodtemplates = @()
$goodtemplates = $templates |% {compare-object $_ -DifferenceObject $images -property basename,version -excludedifferent -includeequal -passthru | Select Name,BaseName,Version}

$badtemplates = diff $goodtemplates.name $templates.name

Foreach ($badtemplate in $badtemplates){
    Write-host "Image and version do not match, deleting"  
    Remove-template -template $($badtemplate.inputobject) -DeletePermanently -confirm:$false
}

2 个答案:

答案 0 :(得分:1)

我认为这可能有效。这应该输出符合您条件的东西:

$templates | foreach-object {
   compare-object $_ -ReferenceObject $templates -DifferenceObject $images -property basename,version -excludedifferent -includeequal -passthru | select Name,BaseName,Version
}

这是一个测试:

PS H:\> $obj1 = [pscustomobject]@{"Name"="sles11sp4_jeos-1234567890";"BaseName"= "sles11sp4_jeos";"Version"=""}

PS H:\> $obj3 = [pscustomobject]@{"Name"="sles12sp3-0.0.11-infra-dr01";"BaseName"= "sles12sp3";"Version"="0.0.11"}

PS H:\> $obj2 = [pscustomobject]@{"Name"="sles12sp3-0.0.11";"BaseName"= "sles12sp3";"Version"="0.0.11"}

PS H:\> $obj4 = [pscustomobject]@{"Name"="win2016std_desk-0.3.33-infra-dr01";"BaseName"= "win2016std_desk";"Version"="0.
3.33"}
PS H:\> $obj5 = [pscustomobject]@{"Name"="win2016std_desk-0.3.45";"BaseName"= "win2016std_desk";"Version"="0.3.45"}

PS H:\> $obj6 = [pscustomobject]@{"Name"="win2016std_desk-0.3.45-infra-dr01";"BaseName"= "win2016std_desk";"Version"="0.
3.45"}
PS H:\> $obj7 = [pscustomobject]@{"Name"="win2016std_desk-0.3.45-stnd-sql01";"BaseName"= "win2016std_desk";"Version"="0.
3.45"}
PS H:\>
PS H:\> $images = @()
PS H:\> $images += @($obj1,$obj2,$obj5)
PS H:\> $templates = @()
PS H:\> $templates += ($obj3,$obj4,$obj6,$obj7)
PS H:\>
PS H:\> $images

Name                      BaseName        Version
----                      --------        -------
sles11sp4_jeos-1234567890 sles11sp4_jeos
sles12sp3-0.0.11          sles12sp3       0.0.11
win2016std_desk-0.3.45    win2016std_desk 0.3.45


PS H:\> $templates

Name                              BaseName        Version
----                              --------        -------
sles12sp3-0.0.11-infra-dr01       sles12sp3       0.0.11
win2016std_desk-0.3.33-infra-dr01 win2016std_desk 0.3.33
win2016std_desk-0.3.45-infra-dr01 win2016std_desk 0.3.45
win2016std_desk-0.3.45-stnd-sql01 win2016std_desk 0.3.45


PS H:\>
PS H:\> $templates |% {compare-object $_ -DifferenceObject $images -property basename,version -excludedifferent -include
equal -passthru | Select Name,BaseName,Version}

Name                              BaseName        Version
----                              --------        -------
sles12sp3-0.0.11-infra-dr01       sles12sp3       0.0.11
win2016std_desk-0.3.45-infra-dr01 win2016std_desk 0.3.45
win2016std_desk-0.3.45-stnd-sql01 win2016std_desk 0.3.45

答案 1 :(得分:0)

您自己走在正确的道路上,但是您创建了太多的循环(考虑到Where-Object cmdlet会引发第三个循环)。

$Images = ConvertFrom-SourceTable '

Name                           BaseName               Version
----                           --------               -------
sles11sp4_jeos-1234567890      sles11sp4_jeos
sles12sp3-0.0.11               sles12sp3              0.0.11
win2012r2std_desk-0.1.23       win2012r2std_desk      0.1.23
win2012r2std_desk-0.2.34       win2012r2std_desk      0.2.34
win2016std_desk-0.3.45         win2016std_desk        0.3.45
win2016std_desk-0.4.56         win2016std_desk        0.3.33
'

$Templates= ConvertFrom-SourceTable '

Name                                            BaseName            Version
----                                            --------            -------
sles12sp3-0.0.11-infra-dr01                     sles12sp3           0.0.11
win2016std_desk-0.3.33-infra-dr01               win2016std_desk     0.3.33
win2016std_desk-0.3.42-infra-dr01               win2016std_desk     0.3.42
win2012r2std_desk-0.1.23-infra-dr01             win2012r2std_desk   0.1.23
win2012r2std_desk-0.2.22-infra-dr01             win2012r2std_desk   0.2.22
sles12sp3-0.0.31-infra-dr01                     sles12sp3           0.0.31
win2016std_desk-0.3.45-infra-dr01               win2016std_desk     0.3.45
win2012r2std_desk-0.2.34-infra-dr01             win2012r2std_desk   0.2.34
sles11sp4_jeos-1234567890-infra-dr01            sles11sp4_jeos
sles12sp3-0.0.11-oracle01                       sles12sp3           0.0.11
sles12sp3-0.0.31-oracle01                       sles12sp3           0.0.31
sles11sp4_jeos-1234567890-oracle01              sles11sp4_jeos
sles12sp3-0.0.11-stnd-linux01                   sles12sp3           0.0.11
win2016std_desk-0.3.33-stnd-win01               win2016std_desk     0.3.33
win2016std_desk-0.3.33-stnd-sql01               win2016std_desk     0.3.33
win2016std_desk-0.4.56-stnd-win01               win2016std_desk     0.4.56
win2012r2std_desk-0.1.23-stnd-win01             win2012r2std_desk   0.1.23
sles12sp3-0.1.22-stnd-linux01                   sles12sp3           0.1.22
win2016std_desk-0.3.45-stnd-sql01               win2016std_desk     0.3.45
win2012r2std_desk-0.2.22-stnd-win01             win2012r2std_desk   0.2.22
sles12sp3-0.1.33-stnd-linux01                   sles12sp3           0.1.33
win2016std_desk-0.3.42-stnd-win01               win2016std_desk     0.3.42
'

只需使用If语句:

Foreach ($image in $images){
    Foreach ($template in $templates){
        if ($template.basename -eq $image.basename -and $template.version -eq $image.version){
            Write-host "Template Name Matches, next"
        }
        Else {
            Write-host "Image and version do not match, deleting"  
            Write-Warning "Remove-template -template $($template.name) -DeletePermanently"
        }
    }
}

您将看到一些结果,例如:

Image and version do not match, deleting
WARNING: Remove-template -template sles12sp3-0.0.11-infra-dr01 -DeletePermanently
Image and version do not match, deleting
WARNING: Remove-template -template win2016std_desk-0.3.33-infra-dr01 -DeletePermanently
Image and version do not match, deleting
WARNING: Remove-template -template win2016std_desk-0.3.42-infra-dr01 -DeletePermanently
Image and version do not match, deleting
WARNING: Remove-template -template win2012r2std_desk-0.1.23-infra-dr01 -DeletePermanently
 ...

您也可以使用此Join-Object cmdlet:

$Templates | Join $Images -On BaseName, Version `
    -Property @{TemplateName = {$Left.Name}; ImageName = {$Right.Name}}, BaseName, Version

结果:

ImageName                 TemplateName                         BaseName          Version
---------                 ------------                         --------          -------
sles12sp3-0.0.11          sles12sp3-0.0.11-infra-dr01          sles12sp3         0.0.11
win2016std_desk-0.4.56    win2016std_desk-0.3.33-infra-dr01    win2016std_desk   0.3.33
win2012r2std_desk-0.1.23  win2012r2std_desk-0.1.23-infra-dr01  win2012r2std_desk 0.1.23
win2016std_desk-0.3.45    win2016std_desk-0.3.45-infra-dr01    win2016std_desk   0.3.45
win2012r2std_desk-0.2.34  win2012r2std_desk-0.2.34-infra-dr01  win2012r2std_desk 0.2.34
sles11sp4_jeos-1234567890 sles11sp4_jeos-1234567890-infra-dr01 sles11sp4_jeos
sles12sp3-0.0.11          sles12sp3-0.0.11-oracle01            sles12sp3         0.0.11
sles11sp4_jeos-1234567890 sles11sp4_jeos-1234567890-oracle01   sles11sp4_jeos
sles12sp3-0.0.11          sles12sp3-0.0.11-stnd-linux01        sles12sp3         0.0.11
win2016std_desk-0.4.56    win2016std_desk-0.3.33-stnd-win01    win2016std_desk   0.3.33
win2016std_desk-0.4.56    win2016std_desk-0.3.33-stnd-sql01    win2016std_desk   0.3.33
win2012r2std_desk-0.1.23  win2012r2std_desk-0.1.23-stnd-win01  win2012r2std_desk 0.1.23
win2016std_desk-0.3.45    win2016std_desk-0.3.45-stnd-sql01    win2016std_desk   0.3.45
相关问题