我有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
testinstance-29-07-15-08-00
testinstance-23-05-15-20-00
testinstance-27-03-15-23-00
testinstance-01-07-15-23-00
testinstance-13-02-15-13-00
testinstance-19-01-15-23-00
testinstance-28-02-15-23-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
我读过有关比较对象的内容。但不确定在我的情况下如何实现,因为所有5个文件的内容都不同,所有这些内容都应该从删除中保存。有人可以指导我实现我所说的。任何帮助都会非常感激。
答案 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