powershell でフォルダの差分を比較するサンプルコード



PowerShellで "c:\files\a" と "d:\files\a" フォルダのフォルダ構成の差分を出力するプログラムを作成しました。ファイルやフォルダの構成までが対象です。
このスクリプトは、両ディレクトリを再帰的に走査し、ルートからの相対パスを比較します。ファイルの中身やタイムスタンプはチェックしません。

【使い方】
比較対象を変更するには$PathAと$PathBの値を変更してください。

このスクリプトを実行すると、"c:\files\a" と "d:\files\a" のいずれかにのみ存在するファイルやフォルダが、その相対パスと共に一覧表示されます。SideIndicator (<= または =>) でどちらのディレクトリに存在するかを確認できます。



# 比較対象のルートディレクトリを定義します。
$PathA = "c:\files\a"
$PathB = "d:\files\a"

# ルートパスから再帰的にすべてのアイテム(ファイルとフォルダ)を取得し、
# ルートパスからの相対パスを計算してリスト化する関数
function Get-RelativePaths {
param(
[Parameter(Mandatory=$true)]
[string]$RootPath
)

# Get-ChildItemで再帰的にすべてのアイテムを取得し、相対パスを計算
# -Forceは隠しファイル/フォルダも含めるため
Get-ChildItem -Path $RootPath -Recurse -Force -ErrorAction SilentlyContinue |

# 相対パス (RelativePath) プロパティを持つ新しいオブジェクトを生成
Select-Object @{
Name = 'RelativePath'
# FullNameからRootPathの長さを引いた部分が相対パス
Expression = { $_.FullName.Substring($RootPath.Length).TrimStart('\') }
} |

# ルートディレクトリ自体(相対パスが空文字になる)は除外
Where-Object { $_.RelativePath -ne "" }
}

# 2つのディレクトリの相対パスリストを取得
$ListA = Get-RelativePaths -RootPath $PathA
$ListB = Get-RelativePaths -RootPath $PathB

Write-Host "--- 比較結果 ---"
Write-Host "差分を出力します。"

# Compare-Objectを使用して、相対パスに基づいて2つのリストを比較し、差分を$Differenceに格納
# PassThruでオリジナルのオブジェクトを出力に含める
$Difference = Compare-Object -ReferenceObject $ListA -DifferenceObject $ListB -Property RelativePath -PassThru

# 結果の表示
if ($Difference) {
$Difference | Format-Table -AutoSize

Write-Host ""
Write-Host "SideIndicatorの説明:"
Write-Host "<= : 左側 ($PathA) にのみ存在するアイテム"
Write-Host "=> : 右側 ($PathB) にのみ存在するアイテム"
} else {
Write-Host "両方のディレクトリ ($PathA と $PathB) のファイルおよびフォルダ構成は完全に一致しています。"
}
Write-Host "----------------"






キーワード:Power Shell

Windows トラブルシューティング一覧に戻る


(ご注意事項)本ページは2017年に独自に調査して記載した事項です。本ページには誤りがある可能性はあります。また今後仕様が変更となる可能性があります。
本ページにより発生したいかなる損失も誰も補償しません。あくまでも自己責任で参考にしてください。