2017-01-12 7 views
1

サブフォルダとファイルを持つ2つのディレクトリ構造があります。私は2番目のディレクトリに重複しているファイルを削除したいと思います。そして、2番目のディレクトリにある空のフォルダを削除します。私はパイピングのセットアップが正しく行われていると思います。ファイルを取り除く方法と、フォルダが空の場合はフォルダを確認する方法がわかりません。問題は、削除コマンドで重複していたファイルのフォルダ構造を判断できないようです。2つのディレクトリを比較し、2番目のディレクトリにある重複ファイルを削除する方法

$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)" 
    } 
+2

なぜ 'robocopy'を使わないのですか? –

答えて

1

あなたはほとんどそこにいる、しかし、あなたが使用するオブジェクトは、あなたがCompare-Objectから取得出力のInputObjectプロパティにネストされています。

変更本このへ

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

Remove-Item $_.InputObject.FullName 

は重複が基準オブジェクト引数(すなわち$Folder1)から除去されることに注意してください。このアプローチは、ファイル名だけ、他には何を比較していることも

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

注:あなたがそれらを$Folder2から削除したい場合は、引数を切り替える必要があります。実際にファイルが同じかどうかを確認する必要がある場合は、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 

また、ファイルの削除元のフォルダを比較の基準として使用する必要があります。

+0

ありがとうAnsgar。それはまさに私が探していたものでした!! –

関連する問題