プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Windows、2つのファイルの更新日時を比較するバッチファイル
多分探せば転がっているでしょうが、気が向いたので作ってみました。
引数にファイルを2つ指定すると、更新日時を比較してどちらが新しいかを判定してくれるバッチファイルです。

処理はこんなんφ(--)適当にコピペして使ってください。

@ECHO OFF

REM ファイル名
SET FILE1=""
SET FILE2=""
SET NEWER_FILE=""

REM 更新日時
SET TIMESTAMP1=""
SET TIMESTAMP2=""
SET NEWER_TIMESTAMP=""

REM 引数チェック
IF "%~1"=="" (
    ECHO "引数1未指定"
    GOTO END
) ELSE (
    IF NOT EXIST %1 (
        ECHO "引数1のファイルが存在しない"
        GOTO END
    ) ELSE (
        SET FILE1=%1
    )
)
IF "%~2"=="" (
    ECHO "引数2未指定"
    GOTO END
) ELSE (
    IF NOT EXIST %2 (
        ECHO "引数2のファイルが存在しない"
        GOTO END
    ) ELSE (
        SET FILE2=%2
    )
)

REM 更新日時取得
FOR %%a IN (%FILE1%) DO SET TIMESTAMP1=%%~ta
FOR %%b IN (%FILE2%) DO SET TIMESTAMP2=%%~tb

REM デバッグ用
ECHO ファイル1:%FILE1%
ECHO ファイル1更新日時:%TIMESTAMP1%
ECHO ファイル2:%FILE2%
ECHO ファイル2更新日時:%TIMESTAMP2%

REM 更新日時比較
IF "%TIMESTAMP1%" == "%TIMESTAMP2%" (
    REM 同じ
    SET NEWER_FILE="同じ"
    SET NEWER_TIMESTAMP=%TIMESTAMP1%
) ELSE (
    IF "%TIMESTAMP1%" GTR "%TIMESTAMP2%" (
        REM ファイル1の方が新しい
        SET NEWER_FILE=%FILE1%
        SET NEWER_TIMESTAMP=%TIMESTAMP1%
    ) ELSE (
        REM ファイル2の方が新しい
        SET NEWER_FILE=%FILE2%
        SET NEWER_TIMESTAMP=%TIMESTAMP2%
    )
)

REM 新しい方を表示
ECHO 新しい方:%NEWER_FILE%
ECHO 新しい方の更新日時:%NEWER_TIMESTAMP%

:END
PAUSE

特に難しいことはやっていませんし、コメントを読めば分かると思いますが、一応解説しておきますね。

まず最初に

IF "%~1"=="" (
    ECHO "引数1未指定"
    GOTO END
) ELSE (
    IF NOT EXIST %1 (
        ECHO "引数1のファイルが存在しない"
        GOTO END
    ) ELSE (
        SET FILE1=%1
    )
)
IF "%~2"=="" (
    ECHO "引数2未指定"
    GOTO END
) ELSE (
    IF NOT EXIST %2 (
        ECHO "引数2のファイルが存在しない"
        GOTO END
    ) ELSE (
        SET FILE2=%2
    )
)

の部分で引数チェックをしています。
「引数が指定されているか」「指定されたファイルがあるか」の2つがチェック項目です。

引数チェックした後

FOR %%a IN (%FILE1%) DO SET TIMESTAMP1=%%~ta
FOR %%b IN (%FILE2%) DO SET TIMESTAMP2=%%~tb

の部分で、それぞれのファイルのタイムスタンプを取得しています。

バッチファイルの引数でファイルを指定した場合「%1」や「%~1」でファイル名を取得できますが
「%~t1」でそのファイルのタイムスタンプを取得できるのです。

それを利用してあーだこーだやって、変数「TIMESTAMP1」「TIMESTAMP2」に
それぞれのファイルのタイムスタンプを格納しています。

バッチファイルにおける「FOR~IN~DO」の流れは、決まり文句として覚えてしまってください。
使い所はループ処理をさせたい場合だけではありません。
例えばコマンドの実行結果を変数に入れたい場合などにも登場します。

これでそれぞれのファイルのタイムスタンプが取得できたので

IF "%TIMESTAMP1%" == "%TIMESTAMP2%" (
    REM 同じ
    SET NEWER_FILE="同じ"
    SET NEWER_TIMESTAMP=%TIMESTAMP1%
) ELSE (
    IF "%TIMESTAMP1%" GTR "%TIMESTAMP2%" (
        REM ファイル1の方が新しい
        SET NEWER_FILE=%FILE1%
        SET NEWER_TIMESTAMP=%TIMESTAMP1%
    ) ELSE (
        REM ファイル2の方が新しい
        SET NEWER_FILE=%FILE2%
        SET NEWER_TIMESTAMP=%TIMESTAMP2%
    )
)

で比較して新しい方を判定しています。ただのIF文です。

今回は半分以上お遊びなので、結果を画面に出力しています。

「新しければ上書き」「更新されていたらバックアップ」等の処理をバッチファイルでやる際には、
もうちょっと改良すれば使えるんじゃないですかね(--?

そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:コマンド/バッチ  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事