在 Windows 7 中根据 LastWriteTime(最后修改时间)比较文件夹内容

Compare folders content based on LastWriteTime (last-modified), in Windows 7

我需要根据 LastWriteTime 属性 比较两个不同文件夹(及其子文件夹)的文件(具有相同的名称),这样我就可以找出是否有修改(如果是,然后哪个文件夹中的哪个文件是最新的)。

总而言之:我只想知道第二个文件夹中是否有最近修改过的文件副本

我正在尝试 运行 Powershell 2.0 脚本来执行此操作,但似乎我不知道我在做什么:

$orig = Get-ChildItem -Recurse -path L:\original-files\
$backup = Get-ChildItem -Recurse -path I:\backup-files\

Compare-Object $orig $backup -Property LastWriteTime

输出这个:

...
Report -- XXXXXXXX, Meeting with suppl... 23/02/2015 17:45:38                     =>                                     
Report -- XXXXXXXX, Meeting with suppl... 17/11/2015 20:29:04                     =>                                     
Report -- XXXXXXXX, Meeting with suppl... 06/08/2015 22:39:06                     =>                                     
Report -- XXXXXXXX, Meeting with suppl... 07/05/2015 03:43:24                     =>                                     
Report -- XXXXXXXX, Meeting with suppl... 26/06/2015 15:22:36                     =>                                     
Report -- XXXXXXXX, Meeting with suppl... 26/06/2015 17:03:48                     =>                                     
Report -- XXXXXXXX, Meeting with suppl... 13/09/2015 15:41:38                     =>                                     
Report -- XXXXXXXX, Meeting with suppl... 21/06/2015 23:28:06                     =>                                     
Report -- XXXXXXXX, Meeting with suppl... 22/02/2015 01:23:58                     =>                                     
Report -- XXXXXXXX, Meeting with suppl... 11/12/2015 00:50:52                     =>                                     
Report -- XXXXXXXX, Meeting with suppl... 30/10/2015 05:27:48                     <=                                     
Report -- XXXXXXXX, Meeting with suppl... 31/05/2015 17:46:08                     <= 
...

所以,这个脚本有两个问题:

  1. 我真的不知道文件的名称,因为它们得到了 运行分类。
  2. 我仍然不知道哪个文件是最后修改的,因为我得到的大部分时间都是相同的文件名(不是路径名),但带有倒置的 SideIndicator 标志,出现在列出 2 次(很少 1 或 3 次)(我认为发生这种情况是因为我可能在不同的子文件夹中有相同文件的副本)。例如:

    example.docx     25/12/2015 15:15:05              =>
    example.docx     23/12/2015 12:36:03              <=
    

这两个同名文件在哪里?在这种情况下,“=>”和“<=”符号应该是什么意思,我在列表中用倒号重复了相同的文件名?

我只是浪费了一天的时间来尝试这个。请帮忙!我在Win 7 64位。

谢谢!!!


PS:我刚发现附加 | Format-List(即 Compare-Object $orig $backup -Property LastWriteTime | Format-List)可以正确显示文件的全名,但不能正确显示文件的路径。因此,知道 'Example.docx' 在列表中出现 2 次带有 '=>' 符号和 1 次带有 '<=' 符号是没有用的。

PS2:我试过改变

$orig = Get-ChildItem -Recurse -path L:\original-files\
$backup = Get-ChildItem -Recurse -path I:\backup-files\

$orig = Get-ChildItem -Recurse -path L:\original-files\ | Format-List -Property Name, Fullname, LastWriteTime
$backup = Get-ChildItem -Recurse -path I:\backup-files\ | Format-List -Property Name, Fullname, LastWriteTime

但是 diff $orig $backup - property lastwritetime | format-list 输出:

lastwritetime :
SideIndicator : =>

lastwritetime :
SideIndicator : =>

lastwritetime :
SideIndicator : =>

lastwritetime :
SideIndicator : =>

lastwritetime :
SideIndicator : =>

lastwritetime :
SideIndicator : =>

lastwritetime :
SideIndicator : =>

lastwritetime :
SideIndicator : =>

lastwritetime :
SideIndicator : =>

如果您要在两个文件夹中查找具有相同名称的文件并且您想要查找最新的文件,我会尝试这样的操作:

$Source = Get-ChildItem -Path 'C:\Test1' -Recurse -File
$Target = Get-ChildItem -Path 'C:\Test2' -Recurse -File

$Differences = Compare-Object -ReferenceObject $Source -DifferenceObject $Target -Property LastWriteTime -PassThru

$Differences | Group-Object Name | Select -ExpandProperty Group | 
    Sort-Object LastWriteTime | Select-Object -Last 1

使用开关 -File 我们只询问文件,-Recurse 显示所有子文件夹中的所有文件。

然后我们寻找具有不同 LastWriteTime 的同名案例文件的差异,并将其保存在变量 $Differences.

然后我们通过Group-Object将所有同名文件归为一组来分析差异。完成后,我们查看一个包含多个同名文件的对象,并将它们按 LastWriteTime 排序,其中我们 select 只有最近的 Select-Object -Last 1.

希望这对您找到方向有所帮助。永远记住,在 PowerShell 中,帮助并不遥远:

Get-Help Compare-ObjectGet-Help Compare-Object -Examples 让你走得更远。

所以,在被PS揍了之后,我写了这个效率不高的"javascript-esque" Powershell 2.0脚本。无需更改首选项等,只需启动控制台并粘贴整个代码块:

$sourcePath = "C:\test1"
$targetPath = "C:\test2"

$source = Get-ChildItem -LiteralPath $sourcePath -Recurse | where { ! $_.PSIsContainer }
$target = Get-ChildItem -LiteralPath $targetPath -Recurse | where { ! $_.PSIsContainer }


$sourceGroup = $source | group-object -property name
$targetGroup = $target | group-object -property name
$includedOrNot = Compare-Object -ReferenceObject $sourceGroup -DifferenceObject $targetGroup -Property Name -Passthru
$excludedSource = $includedOrNot | where-object { $_.SideIndicator -eq "=>"}
$excludedTarget = $includedOrNot | where-object { $_.SideIndicator -eq "<="}

$differentTime = Compare-Object -ReferenceObject $Source -DifferenceObject $Target -Property LastWriteTime -PassThru

$filesInTarget = @()

$buffer = @()
foreach ($i in $differentTime) {$buffer += , @($i.name, $i.lastwritetime, $i.fullname)}

for ($i = 0; $i -ne $buffer.length; $i++) {
$bufname = $buffer[$i][0] ; $buftime = $buffer[$i][1]; foreach ($ii in $buffer) {
if ($ii[0] -eq $bufname -and $ii[1] -gt $buftime -and $ii[2].startswith($targetPath)) {
$filesInTarget += , @($ii)
}
}
}

$newerFiles = @()
foreach ($iii in $filesInTarget) {$newerFiles+= $iii[-1]}

echo "`n`n***START`n`n`nAbsent files in SOURCE folder:`n`n"; $excludedSource |format-list;`
"`n`nAbsent files in TARGET folder:`n"; $excludedTarget |format-list;`
"`n`n`n`n`nNEWER FILES IN TARGET FOLDER:`n`n"; $filesInTarget | format-list;`
"`n`n`n`n`n`n`n`n`n`nSUMMARY:`n`nNumber of files absent in SOURCE: " + $excludedSource.count;`
$excludedSource | Format-Table Count, Name -Autosize;`
"`nNumber of files absent in TARGET: " + $excludedTarget.count;`
$excludedTarget | Format-Table Count, Name -Autosize;`
"`nNewer files in target folder:", $newerFiles, "`n`n***END`n"

#END OF FILE

它显示目标文件夹和子文件夹中是否有最近更改的同名文件(与源文件夹和子文件夹相比)。它还告诉是否一个文件夹中有文件,但另一个文件夹中没有同名文件。

非常感谢 DarkLite1 让我走上了正确的道路!