我有两个包含子文件夹和文件的目录结构。我想删除第二个目录中任何重复的文件。然后删除第二个目录中找到的所有空文件夹。我认为我已经正确设置了管道设置,我只是不确定如何删除文件,如果文件夹是空的,则该文件夹。问题似乎是我无法确定删除命令中重复文件的文件夹结构。
$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)"
}
答案 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
同样,您需要使用要从中删除文件的文件夹作为比较参考。