2012年12月18日火曜日

Powershellで同じ構造のフォルダを比較

  • このエントリーをはてなブックマークに追加


同じ構造のフォルダを比較するPowershellスクリプトを書いてみました。

フォルダ内のサブフォルダ、ファイルのパス、更新日時、サイズを基準にして比較しています。

ソースコードは以下の通りです。

#==============================================
#処理:同じ構造のフォルダを比較する
#実行条件:2つのフォルダ名が同じであること
#==============================================
$dir1 = "u:\test"
$dir2 = "c:\temp\test"

if(!(Test-Path $dir1) -or !(Test-Path $dir2)){
    Write-Output "フォルダが存在しません。"
    Exit 1
}

$dir1name = (Get-Item $dir1).Name
$parent1 = (Get-Item $dir1).Parent.Name
$dir2name = (Get-Item $dir2).Name
$parent2 = (Get-Item $dir2).Parent.Name
if($dir1name -ne $dir2name){
    Write-Output "フォルダ名が異なるため、比較できません。"
    Exit 1
}

#連想配列
$content = @{}
$dir1only = @()
$dir2only = @()

$dir1con = Get-ChildItem $dir1 -Recurse | % {$nametime = $_.fullname + " " + $_.lastwritetime.ToString() + " " + $_.Length; Write-Output $nametime}
$dir2con = Get-ChildItem $dir2 -Recurse | % {$nametime = $_.fullname + " " + $_.lastwritetime.ToString() + " " + $_.Length; Write-Output $nametime}

foreach($con in $dir1con){
    $item = $con.Substring($parent1.Length)
    $content[$item] = -1
}

foreach($con in $dir2con){
    $item = $con.Substring($parent2.Length)
    if(++$content[$item] -eq 1){
        $dir2only += $con
    }
}

foreach($con in $dir1con){
    $item = $con.Substring($parent1.Length)
    if($content[$item] -eq -1){
        $dir1only += $con
    }
}

Write-Output "差分を出力します。"
Write-Output "-----------$dir1-----------"
Write-Output $dir1only
Write-Output "-----------$dir2-----------"
Write-Output $dir2only

 

ソースコードをコピーし、$dir1、$dir2に該当の値を変更して.ps1に保存して実行する。

機能が十分ではないため、複雑な比較はできません。

Windows Server 2012 Hyper-V Cookbook

新品価格
¥4,330から
(2012/12/20 20:55時点)

この記事がお役にたちましたらシェアをお願いします:)

  • このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿