PowerShell ファイル差異
ファイルの比較はCompare-Objectを使用します。
■サンプル①:ファイル比較
a.txt、b.txtを用意して比較します。C:\work\a.txt
a
b1
c
d
e
f
C:\work\b.txt
a
b2
c
f
e
Compare-Object (Get-Content C:\work\a.txt) (Get-Content C:\work\b.txt)
実行結果
InputObject SideIndicator
----------- -------------
b2 =>
b1 <=
d <=
差異や片方しか存在しないのは検知されましたが、行の順番が異なるのは検知されませんでした。
■サンプル②:フォルダ比較
$dirA、$dirBに比較するフォルダを指定し、$outputに結果を出力するようにしました。対象はテキストファイル(*.txt)のみとしています。
#ファイル差異を検出
function diffFile($pathA, $pathB) {
$ret = @()
$conA = Get-Content -Encoding UTF8 $pathA | ForEach-Object { $_.Trim() }
$conB = Get-Content -Encoding UTF8 $pathB | ForEach-Object { $_.Trim() }
$aryDf = Compare-Object $conA $conB
foreach ($objDf in $aryDf) {
if ($objDf.InputObject.Length -gt 0) {
$ret += $objDf.SideIndicator + "`t" + $objDf.InputObject
}
}
return $ret
}
#パス変更
function changePath($dirF, $dirT, $path) {
$name = $path.SubString($dirF.Length)
return $dirT + $name
}
#比較するフォルダ
$dirA = "C:\work\a"
$dirB = "C:\work\b"
#結果出力ファイル
$output = "C:\work\result.txt"
#フォルダ内のファイル取得
$listA = Get-ChildItem -Path $dirA -Recurse -Filter *.txt
$listB = Get-ChildItem -Path $dirB -Recurse -Filter *.txt
#ファイル差異
$aryDf = @()
#フォルダAに存在しない
$aryNoA = @()
#フォルダBに存在しない
$aryNoB = @()
#フォルダAの全ファイル
$aryAllA = @()
#結果
$aryResult = @()
#フォルダAでループ
foreach ($objA in $listA) {
$pathA = $objA.FullName
$pathB = changePath $dirA $dirB $pathA
$aryAllA += $pathA
if (Test-Path $pathB ) {
$ary = diffFile $pathA $pathB
if ($ary.Length -gt 0) {
$aryDf += $pathA
$aryDf += $ary
}
}
else {
$aryNoB += $pathB
}
}
#フォルダBでループ
foreach ($objB in $listB) {
$pathB = $objB.FullName
$pathA = changePath $dirA $pathB
if (!$aryAllA.Contains( $pathA )) {
$aryNoA += $pathB
}
}
#結果出力
if ($aryNoA.Length -gt 0) {
$aryResult += "not exist A"
$aryResult += $aryNoA
}
if ($aryNoB.Length -gt 0) {
$aryResult += "not exist B"
$aryResult += $aryNoB
}
if ($aryDf.Length -gt 0) {
$aryResult += "diff"
$aryResult += $aryDf
}
$aryResult | Out-File $output -Encoding utf8
ページのトップへ戻る