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对象方法,因为我以前没有使用过它。。现在比较数组而不是循环数组似乎工作得非常快,所以我将坚持使用这种方法(我用工作代码更新了我的原始帖子)。谢谢