トッカンソフトウェア

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


			


ページのトップへ戻る