我正在尝试删除重复项,并且只从2个查询的输出中保留唯一条目。
我正在使用以下内容删除已安装的Windows更新列表(同时剥离12个字符空格并放入小写:
$A = @(Get-HotFix | select-object @{Expression={$_.HotFixID.ToLower()}} | ft -hidetableheaders | Out-String) -replace '\s{12}',''
然后我查询文件夹中的可用文件列表,并使用以下方式剥离3个尾随空白字符:
$B = @(Get-ChildItem D:\y | select-object 'Name' | ft -hidetableheaders | Out-String) -replace '\s{3}',''
我遇到的问题是第一个查询($ A)返回输出,如:
kb4040981
kb4041693
kb2345678
kb8765432
第二个查询($ B)返回输出,如:
windows8.1-kb4040981-x64_d1eb05bc8c55c7632779086079c7759f40d7386f.cab
windows8.1-kb4041687-x64_3bdf264bcfc0dda01c2eaf2135e322d2d6ce6c64.cab
windows8.1-kb4041693-x64_359b7ac71a48e5af003d67e3e4b80120a2f5b570.cab
windows8.1-kb4049179-x64_e6ec21d5d16fa6d8ff890c0c6042c2ba38a1f7c4.cab
我需要在$ A数组中的每个条目周围使用通配符比较2个输出(我认为),并且它在$ B中的位置从$ B数组中删除整行。
我不能截断$ B的输出,因为我需要在后续过程中使用完整的文件名。
在上面的示例输出中,整个FIRST和THIRD行将从$ B数组中删除,其他行保持不变。
我尝试了多种在线搜索方法,并使用了foreach循环,但都无济于事。
提前感谢你的帮助。
答案 0 :(得分:1)
我建议您花一点时间学习Powershell的基础知识。当您使用格式cmdlet和文本文件而不是对象时,您可以使用自己的好东西。 ;-) 以下是我将如何开始这项任务:
$A = Get-HotFix
$B = Get-ChildItem D:\y | Select-Object -Property Name,@{Name='HotFixID';Expression={($_.BaseName -split '-')[1]}}
Compare-Object -ReferenceObject $A -DifferenceObject $B -Property 'HotFixID' -PassThru
答案 1 :(得分:1)
你尝试使用不起作用的foreach循环是什么?除非你的输出很大,否则这种方法非常严格。
$a = "kb4040981","kb4041693","kb2345678","kb8765432","test"
[System.Collections.ArrayList]$b = "windows8.1-kb4040981-x64_d1eb05bc8c55c7632779086079c7759f40d7386f.cab","windows8.1-kb4041687-x64_3bdf264bcfc0dda01c2eaf2135e322d2d6ce6c64.cab","windows8.1-kb4041693-x64_359b7ac71a48e5af003d67e3e4b80120a2f5b570.cab","windows8.1-kb4049179-x64_e6ec21d5d16fa6d8ff890c0c6042c2ba38a1f7c4.cab"
$toRemove = New-Object System.Collections.ArrayList
foreach($kb in $a)
{
foreach($line in $b)
{
if($line -match $kb)
{
write-host "$kb found in: $line" -ForegroundColor Green
$toRemove.add($line) | out-null
}
}
}
foreach($line in $toRemove)
{
$b.Remove($line)
}
$b
希望它有所帮助。