【bat】バッチファイルで指定フォルダ配下の最新更新ファイルを取得する方法

バッチファイルを使って指定したフォルダ内の最も更新日付が新しいファイルを取得する方法についてご紹介します。この手順を実行することで、ファイルの更新日を簡単に管理できるようになります。

変数の初期化

まず、最新の更新日時とファイル名を保持するための変数を初期化します。これにより、後続の処理でこれらの変数に最新の情報を格納できるようになります。

setlocal
set "folderPath=C:\path\to\your\folder"
set "latestDate="
set "latestFile="

フォルダ内のファイルをループで処理

次に、for ループを使用して指定したフォルダ内の各ファイルを処理します。ここでは、dir コマンドを使用してフォルダ内のファイルリストを取得します。

for /f "delims=" %%f in ('dir /b /a-d "%folderPath%"') do (
    set "currentFile=%folderPath%\%%f"
    ...
)

ファイルの更新日付を取得

各ファイルの更新日付を取得し、変数に格納します。dir /tc コマンドを使用してファイルの作成日を取得し、それを解析します。

for /f "tokens=1-3 delims= " %%a in ('dir /tc "%currentFile%" ^| findstr /r "^[0-9]"') do (
    set "fileDate=%%a"
    set "fileTime=%%b"
)

最新の日付のファイルを更新

取得した日付を比較し、最新の日付のファイルを特定します。最新のファイルが見つかった場合、変数を更新します。

if not defined latestDate (
    set "latestDate=%fileDate% %fileTime%"
    set "latestFile=%currentFile%"
) else (
    call :compareDates "%fileDate% %fileTime%" "%latestDate%"
    if %errorlevel% gtr 0 (
        set "latestDate=%fileDate% %fileTime%"
        set "latestFile=%currentFile%"
    )
)

最新のファイルを表示

最後に、最新のファイルを表示します。これにより、どのファイルが最も新しいかが一目でわかります。

echo 最新のファイルは: %latestFile%
endlocal
goto :eof

日付を比較するサブルーチン

2つの日付を比較するためのサブルーチンを作成します。これにより、日付の比較が簡単に行えます。

:compareDates
setlocal
set "date1=%~1"
set "date2=%~2"

for /f "tokens=1-3 delims=/:- " %%a in ("%date1%") do set "dt1=%%c%%a%%b"
for /f "tokens=1-3 delims=/:- " %%a in ("%date2%") do set "dt2=%%c%%a%%b"

if "%dt1%"=="%dt2%" exit /b 0
if "%dt1%" gtr "%dt2%" exit /b 1
exit /b -1

サンプルコード

@echo off
setlocal

rem フォルダパスを指定
set "folderPath=C:\path\to\your\folder"

rem 最新の更新日時とファイル名を初期化
set "latestDate="
set "latestFile="

rem フォルダ内のファイルをループ
for /f "delims=" %%f in ('dir /b /a-d "%folderPath%"') do (
    set "currentFile=%folderPath%\%%f"
    
    rem ファイルの更新日付を取得
    for /f "tokens=1-3 delims= " %%a in ('dir /tc "%currentFile%" ^| findstr /r "^[0-9]"') do (
        set "fileDate=%%a"
        set "fileTime=%%b"
    )
    
    rem 日付を比較し最新のファイルを特定
    if not defined latestDate (
        set "latestDate=%fileDate% %fileTime%"
        set "latestFile=%currentFile%"
    ) else (
        call :compareDates "%fileDate% %fileTime%" "%latestDate%"
        if %errorlevel% gtr 0 (
            set "latestDate=%fileDate% %fileTime%"
            set "latestFile=%currentFile%"
        )
    )
)

rem 最新のファイルを表示
echo 最新のファイルは: %latestFile%
endlocal
goto :eof

:compareDates
rem 2つの日付を比較するサブルーチン
setlocal
set "date1=%~1"
set "date2=%~2"

rem 日付をYYYYMMDDHHMMSS形式に変換
for /f "tokens=1-3 delims=/:- " %%a in ("%date1%") do set "dt1=%%c%%a%%b"
for /f "tokens=1-3 delims=/:- " %%a in ("%date2%") do set "dt2=%%c%%a%%b"

if "%dt1%"=="%dt2%" exit /b 0
if "%dt1%" gtr "%dt2%" exit /b 1
exit /b -1

このバッチファイルを実行すると、指定したフォルダ内で最も更新日付が新しいファイルが表示されます。これにより、最新のファイルを簡単に特定し、管理することが可能です。