在Windows 7

时间:2016-02-25 07:06:56

标签: file powershell compare directory last-modified

我需要根据它们的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              <=
    
  3. 这两个名称相同的文件在哪里?什么应该“=&gt;”并且“&lt; =”符号在这种情况下意味着,我在列表中重复使用相同的文件名,并带有倒置符号?

    我只是浪费了一天的努力。请帮忙!我在Win 7 64位上。

    谢谢!!!

    PS:我发现附加| Format-List(即Compare-Object $orig $backup -Property LastWriteTime | Format-List)正确显示文件的全名,但不显示其路径。因此,知道'Example.docx'在列表中出现2次并带有'=&gt;'是没用的使用'&lt; ='符号进行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 : =>
    

2 个答案:

答案 0 :(得分:2)

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

$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-Object -Last 1的最新文件。

希望这有助于您找到自己的方式。永远记住,PowerShell中的帮助并不遥远:

Get-Help Compare-ObjectGet-Help Compare-Object -Examples为您提供了很长的路要走。

答案 1 :(得分:0)

所以,在被PS殴打之后,我写了这个效率低下的#javascript-esque&#34; 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让我走上了正确的道路!