複数人で帳票を編集しているとき,最新はどれって思うことありませんか?
変更時のルールが曖昧な時など,人によってファイル名に rev1 をつけて保存したり,日付を付けて保存したりと最新のファイルの名前が変化していきます。。
で・・・・,どれが最新なのかひとつづつファイルを開いて確認するのは面倒だったので,Winmarge の差分レポート作成を一括で作成するスクリプトを書いてみました。
とあるフォルダのファイル(残念な状態)
○○台帳.xlsx
○○台帳_220610.xlsx
○○台帳_220610_rev1.xlsx
○○台帳_rer2.xlsx
○○台帳_ver2_220615.xlsx
どうやって比較しようか
ファイルのタイムスタンプが近いファイルどおしは,タイムスタンプが遠いもよりは,変更箇所は少ないという考えのもと
タイムスタンプの近いもの通しで比較し差分レポートを作ります。
Script
GetDiffreport.bat
powershell -NoProfile -ExecutionPolicy Unrestricted -File Get-DiffReport.ps1 -filePrefix "○○台帳_" -debugMode -All
Get-DiffReport.ps1
# WinmargeでエクセルDiffReportを作成する
# 初版 22.06.15 SBY
param (
[Parameter(Position=0)]
[string]
$filePrefix = "AAAA帳票BBBBB_",
[Parameter()]
[Switch]
$all = $false,
[Parameter()]
[Switch]
$debugMode = $false
)
# ============ 初期設定 ===================
$WINMARGE = "C:\Program Files\WinMerge\WinMergeU.exe"
$WINMARGEOP = " -noninteractive -minimize "
# =========================================
$t_file = $filePrefix + "*.xlsx"
# ファイルリスト取得し降順(最新のファイルがidx=0になる)で並び変え
$files = get-childitem -Filter $t_file | Sort-Object -Property 'LastWriteTime' -Descending
if ($debugMode) {
write-host $files.count
}
if ( $files.count -ge 2){
# ファイルが2つ以上の時に処理する
# $all が true:全ファイルを対象に差分レポートを作成する
# $all が false:最新のファイルとひとつ前のファイルのみ比較する
if ($all){
$fidxs = 0..($files.count - 2)
} else{
$fidxs = 0
}
foreach ($fidx in $fidxs){
$file0 = $files[$fidx] # 最も最近のファイル
$file1 = $files[$fidx+1] # そのひとつ前のタイムスタンプ
$outFileName = $filePrefix + $file0.LastWriteTime.ToString("yyyyMMdd") + "_" + $file1.LastWriteTime.ToString("yyyyMMdd") + ".html"
if ($debugMode) {
write-host "Inputfile1:" $file0.Name
write-host "Inputfile2:" $file1.Name
write-host "Outputfile:" $outFileName
}
# ======= winmargeの実行 ==================
# Winmargeの引数を作成
$args = $file0.Name + " " + $file1.Name + " -or " + $outFileName + " " + $WINMARGEOP
if (-not (test-path $outFileName)) {
write-host "Winmargeで比較処理を実行します。"
# Winmarge を実行 ,-Waitで終了まで待機
Start-Process -FilePath $WINMARGE -Wait -ArgumentList $args
} else {
write-host "出力ファイルが既にあるためWinmarge比較をパスします。"
}
}
}