Windows Powershellを使用して、2つのフォルダー構造の内容の違いを見つけようとしています。次の方法を使用してファイル名が同じであることを確認しましたが、この方法ではファイルの内容が同じかどうかはわかりません。
$firstFolder = Get-ChildItem -Recurse folder1
$secondFolder = Get-ChildItem -Recurse folder2
Compare-Object -ReferenceObject $firstFolder -DifferenceObject $secondFolder
このServerFaultの質問 で説明されている手法は、単一のファイルを比較するために機能しますが、これらのフォルダーには、さまざまな深さで何百ものファイルが含まれています。
ソリューションは必ずしもファイルの具体的な違いを私に伝える必要はありません。日付など、すでにわかっているメタデータの違いには興味がありません。
比較をループにラップする場合は、次の方法を使用します。
$folder1 = "C:\Users\jscott"
$folder2 = "C:\Users\public"
# Get all files under $folder1, filter out directories
$firstFolder = Get-ChildItem -Recurse $folder1 | Where-Object { -not $_.PsIsContainer }
$firstFolder | ForEach-Object {
# Check if the file, from $folder1, exists with the same path under $folder2
If ( Test-Path ( $_.FullName.Replace($folder1, $folder2) ) ) {
# Compare the contents of the two files...
If ( Compare-Object (Get-Content $_.FullName) (Get-Content $_.FullName.Replace($folder1, $folder2) ) ) {
# List the paths of the files containing diffs
$_.FullName
$_.FullName.Replace($folder1, $folder2)
}
}
}
これは存在しないファイルを無視することに注意してください両方$folder1
および$folder2
。
私はjscottの回答を拡張して、そのタイプの機能に精通していない人のために、一方には存在するが他方には存在しないファイルを出力するように拡張しました。あまり大きな違いのない巨大なフォルダを考えると、私がそれを見るのが困難であったので、それはまた、進歩を示していることに注意してください。台本がぶら下がっているようだった。これはそのためのPowerShellコードです。
$folder1 = "C:\Folder1"
$folder2 = "C:\Folder2"
# Get all files under $folder1, filter out directories
$firstFolder = Get-ChildItem -Recurse $folder1 | Where-Object { -not $_.PsIsContainer }
$failedCount = 0
$i = 0
$totalCount = $firstFolder.Count
$firstFolder | ForEach-Object {
$i = $i + 1
Write-Progress -Activity "Searching Files" -status "Searching File $i of $totalCount" -percentComplete ($i / $firstFolder.Count * 100)
# Check if the file, from $folder1, exists with the same path under $folder2
If ( Test-Path ( $_.FullName.Replace($folder1, $folder2) ) ) {
# Compare the contents of the two files...
If ( Compare-Object (Get-Content $_.FullName) (Get-Content $_.FullName.Replace($folder1, $folder2) ) ) {
# List the paths of the files containing diffs
$fileSuffix = $_.FullName.TrimStart($folder1)
$failedCount = $failedCount + 1
Write-Host "$fileSuffix is on each server, but does not match"
}
}
else
{
$fileSuffix = $_.FullName.TrimStart($folder1)
$failedCount = $failedCount + 1
Write-Host "$fileSuffix is only in folder 1"
}
}
$secondFolder = Get-ChildItem -Recurse $folder2 | Where-Object { -not $_.PsIsContainer }
$i = 0
$totalCount = $secondFolder.Count
$secondFolder | ForEach-Object {
$i = $i + 1
Write-Progress -Activity "Searching for files only on second folder" -status "Searching File $i of $totalCount" -percentComplete ($i / $secondFolder.Count * 100)
# Check if the file, from $folder2, exists with the same path under $folder1
If (!(Test-Path($_.FullName.Replace($folder2, $folder1))))
{
$fileSuffix = $_.FullName.TrimStart($folder2)
$failedCount = $failedCount + 1
Write-Host "$fileSuffix is only in folder 2"
}
}
すでにこれに回答したリンクされた質問からの正しい回答をループで囲み、同じ名前のすべてのファイルを比較するディレクトリツリーをたどります。
/編集:それが実際にあなたの質問である場合、それはあなたが通常の貢献者であると思われるSOにとってより適切です。あなたはプログラミングの質問をしています。 sysadminタイプの目的で使用しているとのことですが、その場合は、WinDiffなどの専用ツールを使用するように指示します。
これを行う:
compare (Get-ChildItem D:\MyFolder\NewFolder) (Get-ChildItem \\RemoteServer\MyFolder\NewFolder)
そして再帰的にさえ:
compare (Get-ChildItem -r D:\MyFolder\NewFolder) (Get-ChildItem -r \\RemoteServer\MyFolder\NewFolder)
そして忘れることも難しいです:)