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

Powershell 比较多维数组中的多个对象,powershell,Powershell,我已经为此奋斗了几个星期。基本上,我想比较两个多维数组中的数据 这是我的第一个阵列: $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]}})

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

这是我的第一个阵列:

$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
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 = @(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
----                           --------               -------
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
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循环中一次比较一个模板,它们最终会删除所有模板。如何比较阵列,以便在新阵列中获得所有“好”模板或所有“坏”模板

这是我的代码的最后一次迭代(没有工作…没有删除任何内容)

这是最后一个有效的代码!注意:我需要添加一个switch命令来将删除的内容导出到csv,如果开关为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
}

我想这可能行得通。这将输出符合您标准的内容:

$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

你自己走在正确的道路上,但是你创建了太多的循环(考虑到发起人是第三个循环)

$Images=

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
'
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=

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
'
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
 ...
您也可以使用此cmdlet:

结果:

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

我认为我们走在正确的道路上。不幸的是,它没有返回所有匹配的模板。它只返回一个匹配$image的。我做了一个可能有用的更改,就是这样!你不知道我花了多长时间才得到这个输出。我真是太感谢你了!谢谢我将看一看join对象方法,因为我以前没有使用过它。。现在比较数组而不是循环数组似乎工作得非常快,所以我将坚持使用这种方法(我用工作代码更新了我的原始帖子)。谢谢