比较6个对象的内容并删除不匹配的对象

时间:2015-07-31 07:58:55

标签: powershell

我有6个动态创建的文件(所以,我不知道内容)。我需要比较这6个文件(确切地说比较一个文件和另外5个文件)并查看文件1中的所有内容与其他文件匹配的内容。匹配的内容应该保存,其他文件需要删除。

我编写了类似下面的内容,但删除了所有内容(也是匹配的)。

$lines = Get-Content "C:\snaps.txt"
$check1 = Get-Content "C:\Previous_day_latest.txt"
$check2 = Get-Content "C:\this_week_saved_snaps.txt"
$check3 = Get-Content "C:\all_week_latest_snapshots.txt"
$check4 = Get-Content "C:\each_month_latest.txt"
$check5 = Get-Content "C:\exclusions.txt"
foreach($l in $lines)
{
  if(($l -notmatch $check1) -and ($l -notmatch $check2) -and ($l -notmatch $check3) -and ($l -notmatch $check4))
  {
   Remove-Item -Path "C:\$l.txt"
  }else
  {
   #nothing
  }
 }
foreach($ch in $check5)
{
 Remove-Item -Path "C:\$ch.txt"
}

6个文件的内容如下所示:

$线

testinstance-01-07-15-08-00
testinstance-10-07-15-23-00
testinstance-13-02-15-13-00
testinstance-15-06-15-23-00
testinstance-19-01-15-23-00
testinstance-23-05-15-20-00
testinstance-27-03-15-23-00
testinstance-28-02-15-23-00
testinstance-29-07-15-08-00
testinstance-30-04-15-23-00
testinstance-30-06-15-23-00
testinstance-31-01-15-23-00
testinstance-31-12-14-23-00

$ CHECK1

testinstance-29-07-15-08-00

$ CHECK2

testinstance-23-05-15-20-00
testinstance-27-03-15-23-00

$ check3

testinstance-01-07-15-23-00
testinstance-13-02-15-13-00
testinstance-19-01-15-23-00

$ check4

testinstance-28-02-15-23-00
testinstance-30-04-15-23-00
testinstance-30-06-15-23-00
testinstance-31-01-15-23-00

$ check5

testinstance-31-12-14-23-00

我读过有关比较对象的内容。但不确定在我的情况下如何实现,因为所有5个文件的内容都不同,所有这些内容都应该从删除中保存。有人可以指导我实现我所说的。任何帮助都会非常感激。

3 个答案:

答案 0 :(得分:2)

我会创建一个array个文件进行检查,这样您就可以直接添加新文件,而无需修改脚本的其他部分。

我使用where cmdlet,使用-in条件过滤参考文件中的所有行,最后覆盖文件:

$referenceFile = 'C:\snaps.txt'

$compareFiles = @(
    'C:\Previous_day_latest.txt', 
    'C:\this_week_saved_snaps.txt', 
    'C:\all_week_latest_snapshots.txt', 
    'C:\each_month_latest.txt', 
    'C:\exclusions.txt'
    )

# get the content of the reference file
$referenceContent = (gc $referenceFile)

foreach ($file in $compareFiles)
{
    # get the content of the file to check
    $content = (gc $file)

    # filter all contents from the file to check which are in the reference file and save it
    $content | where { $_ -in $referenceContent } | sc $file
}

答案 1 :(得分:1)

您可以使用-contains运算符来比较数组内容。如果打开要检查并存储到数组中的所有文件,则可以将其与参考文件进行比较:

$lines = Get-Content "C:\snaps.txt"
$check1 = "C:\Previous_day_latest.txt"
$check2 = "C:\this_week_saved_snaps.txt"
$check3 = "C:\all_week_latest_snapshots.txt"
$check4 = "C:\each_month_latest.txt"
$check5 = "C:\exclusions.txt"
$checklines = @()

(1..5) | ForEach-Object {
  $comp = Get-Content $(Get-Variable check$_).value
  $checklines += $comp
}

$matches = $lines | ? { $checklines -contains $_ }

如果您将-contains切换为-notcontains,您会看到三行不匹配

答案 2 :(得分:1)

这里的其他答案很棒,但我想告诉你Compare-Object仍然有效。但是你需要在循环中使用它。只是尝试显示某些东西其他我包含了Join-Path的简单用法来构建检查数组。基本上,当您将文件移动到生产区域时,我们会保存一些输入。更新一条路径而不是更多路径。

$rootPath = "C:\"
$fileNames = "Previous_day_latest.txt", "this_week_saved_snaps.txt", "all_week_latest_snapshots.txt", "each_month_latest.txt", "exclusions.txt"
$lines = Get-Content (Join-path $rootPath "snaps.txt")
$checks =  $fileNames | ForEach-Object{Join-Path $rootPath $_}

ForEach($check in $checks){
    Compare-Object -ReferenceObject $lines -DifferenceObject (Get-Content $check) -IncludeEqual | 
        Where-Object{$_.SideIndicator -eq "=="} | 
        Select-Object -ExpandProperty InputObject |
        Set-Content $check
}

因此,我们采用每个文件路径并在循环中使用Compare-Object,将每个文件路径与$lines数组进行比较。使用-IncludeEqual,我们找到两个文件共享的行,并将这些行写回文件。

根据您拥有的检查数量和位置,可能更容易使用此行来构建数组$checks

$checks = Get-ChildItem "C:\" -Filter "*.txt" | Select-Object -Expand FullName