如何比较两个目录,然后删除在第二个目录中找到的任何重复文件

时间:2017-01-12 13:33:37

标签: powershell

我有两个包含子文件夹和文件的目录结构。我想删除第二个目录中任何重复的文件。然后删除第二个目录中找到的所有空文件夹。我认为我已经正确设置了管道设置,我只是不确定如何删除文件,如果文件夹是空的,则该文件夹。问题似乎是我无法确定删除命令中重复文件的文件夹结构。

$Folder1 = Get-ChildItem -Path C:\Temp\Folder1 -Recurse 
$Folder2 = Get-ChildItem -Path C:\Temp\Folder2 -Recurse

Compare-Object -ReferenceObject $Folder1 -DifferenceObject $Folder2 -IncludeEqual |
    Where-Object {$_.SideIndicator -eq "=="} | 
    ForEach-Object { 
        Remove-Item "$($_.FullName)" 
    }

1 个答案:

答案 0 :(得分:2)

您几乎就在那里,但您想要使用的对象嵌套在InputObject输出的Compare-Object属性中。

改变这个:

Remove-Item "$($_.FullName)"

进入这个:

Remove-Item $_.InputObject.FullName

请注意,重复项将从参考对象参数中删除(即$Folder1)。如果您希望将它们从$Folder2中删除,则需要切换参数:

Compare-Object -ReferenceObject $Folder2 -DifferenceObject $Folder1 -IncludeEqual |
    Where-Object ...

另请注意,此方法仅比较文件名,而不是其他内容。如果您需要检查文件是否实际相同,那么最好使用robocopy生成文件列表,建议@Bill_Stewart

$folder1 = 'C:\Temp\Folder1'
$folder2 = 'C:\Temp\Folder2'

& robocopy.exe "$folder2" "$folder1" /s /l /is /xn /xo /xx /xl /njh /njs /ns /nc /ndl /np |
    ForEach-Object { $_.Trim() } |
    Remove-Item

同样,您需要使用要从中删除文件的文件夹作为比较参考。