我已经为此战斗了两个星期。基本上,我想比较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
}
答案 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