【PR】 バッチファイル

ファイル名に作成日/更新日を一括追加するバッチファイル【図解】

2025-03-07

この記事では、ファイル名の先頭または末尾に作成日または更新日を一括で追加するバッチファイルを紹介します。

例えば、以下のような変更を一括で行うことができます(一例です)。

このバッチファイルの使用例

上のイラストの一番下の例のように、ファイル名から日付を削除することもできます。

このバッチファイルは、この記事内のコードをメモ帳に貼り付けるだけで誰でも簡単に使えます。

大量のファイルの名前を一気に変更できます

陰キャくじら
陰キャくじら

バッチファイルの作成方法

このバッチファイルの作り方はシンプルです。

別の記事で紹介した「バッチファイルの作成方法」の手順3で、以下のコードをメモ帳に貼り付けるだけです。

バッチファイルの名前は何でもかまいません。

@echo off
setlocal enabledelayedexpansion

echo ファイル名の日付処理ツール
echo ----------------------------------

:mode_selection
:: 処理モードの選択
echo 処理モードを選択してください:
echo 1. ファイル名に日付を追加する
echo 2. ファイル名から日付を除去する
set /p modeChoice="選択してください (1 または 2): "

if "%modeChoice%"=="1" (
    goto :add_date_mode
) else if "%modeChoice%"=="2" (
    goto :remove_date_mode
) else (
    echo 無効な選択です。1 または 2 を入力してください。
    echo.
    goto :mode_selection
)

:add_date_mode
echo.
echo ファイル名に日付を追加するモードを選択しました
echo -----------------------------------

:format_selection
:: ユーザーに日付フォーマットを尋ねる
echo 日付のフォーマットを選択してください:
echo 1. YYYYMMDD
echo 2. YYYYMMDDHH
echo 3. YYYYMMDDHHMM
echo 4. YYYYMMDDHHMMSS
set /p formatChoice="選択してください (1~4): "

if "%formatChoice%"=="1" (
    set "format=yyyyMMdd"
) else if "%formatChoice%"=="2" (
    set "format=yyyyMMddHH"
) else if "%formatChoice%"=="3" (
    set "format=yyyyMMddHHmm"
) else if "%formatChoice%"=="4" (
    set "format=yyyyMMddHHmmss"
) else (
    echo 無効な選択です。1~4 の数字を入力してください。
    echo.
    goto :format_selection
)

:date_type_selection
:: ユーザーに日付の種類を尋ねる
echo.
echo 追加する日付の種類を選択してください:
echo 1. 作成日付
echo 2. 更新日付
set /p dateTypeChoice="選択してください (1 または 2): "

if "%dateTypeChoice%"=="1" (
    set "dateTypeText=作成日付"
    set "dateTypeCmd=CreationTime"
    set "dateMarker=作"
) else if "%dateTypeChoice%"=="2" (
    set "dateTypeText=更新日付"
    set "dateTypeCmd=LastWriteTime"
    set "dateMarker=更"
) else (
    echo 無効な選択です。1 または 2 を入力してください。
    echo.
    goto :date_type_selection
)

:position_selection
:: ユーザーに追加する位置を尋ねる
echo.
echo %dateTypeText%をファイル名のどこに追加しますか?
echo 1. 先頭
echo 2. 末尾
set /p position="選択してください (1 または 2): "

if "%position%"=="1" (
    set "positionText=先頭"
    set "prefixMarker=@%dateMarker%@"
    set "suffixMarker=@"
) else if "%position%"=="2" (
    set "positionText=末尾"
    set "prefixMarker=@"
    set "suffixMarker=@%dateMarker%@"
) else (
    echo 無効な選択です。1 または 2 を入力してください。
    echo.
    goto :position_selection
)

echo.
echo 処理のプレビュー:
echo --------------------------------------------------

echo.
echo 以下の名前変更が実行されます:

echo.
echo 検索中です...
echo.

:: 変更対象ファイルの数をカウント
set fileCount=0

:: プレビューを表示
for %%F in (*) do (
    if not "%%~nxF"=="%~nx0" (
        set "filename=%%~nF"
        set "extension=%%~xF"
        
        :: 日付を取得(作成日または更新日)
        for /f "usebackq delims=" %%a in (`powershell -Command "(Get-Item '%%F').%dateTypeCmd%.ToString('!format!')"`) do (
            set "filedate=%%a"
        )
        
        :: 選択した位置に応じたファイル名の処理
        set "cleanedFilename=!filename!"
        set "hasDateMarker=false"
        
        if "%position%"=="1" (
            :: 先頭の日付マーカーをチェック (作 または 更)
            powershell -Command "$fn = '!filename!'; if ($fn -match '^@(作|更)@.*?@_') { exit 1 } else { exit 0 }"
            if !errorlevel! equ 1 (
                set "hasDateMarker=true"
                :: マーカー部分を削除
                for /f "usebackq delims=" %%p in (`powershell -Command "$fn = '!filename!'; if ($fn -match '^@(作|更)@.*?@_(.*)$') { $matches[2] } else { $fn }"`) do (
                    set "cleanedFilename=%%p"
                )
            )
        ) else (
            :: 末尾の日付マーカーをチェック (作 または 更)
            powershell -Command "$fn = '!filename!'; if ($fn -match '_@.*?@(作|更)@$') { exit 1 } else { exit 0 }"
            if !errorlevel! equ 1 (
                set "hasDateMarker=true"
                :: マーカー部分を削除
                for /f "usebackq delims=" %%p in (`powershell -Command "$fn = '!filename!'; if ($fn -match '^(.*)_@.*?@(作|更)@$') { $matches[1] } else { $fn }"`) do (
                    set "cleanedFilename=%%p"
                )
            )
        )
        
        :: 新しいファイル名の作成
        if "%position%"=="1" (
            set "newname=!prefixMarker!!filedate!!suffixMarker!_!cleanedFilename!!extension!"
        ) else (
            set "newname=!cleanedFilename!_!prefixMarker!!filedate!!suffixMarker!!extension!"
        )
        
        :: すでに日付マーカーがある場合はその旨を表示
        if "!hasDateMarker!"=="true" (
            echo   %%F → !newname! [既存の日付を置換]
        ) else (
            echo   %%F → !newname!
        )
        
        set /a fileCount+=1
    )
)

goto :process_confirmation

:remove_date_mode
echo.
echo ファイル名から日付を除去するモードを選択しました
echo --------------------------------------------------

echo.
echo 以下の名前変更が実行されます:

echo.
echo 検索中です...
echo.

:: 変更対象ファイルの数をカウント
set fileCount=0

:: プレビューを表示
for %%F in (*) do (
    if not "%%~nxF"=="%~nx0" (
        set "filename=%%~nF"
        set "extension=%%~xF"
        set "newname=!filename!"
        set "changed=false"
        
        :: 先頭のマーカーを確認して除去(作/更の両方をチェック)
        powershell -Command "$fn = '!filename!'; if ($fn -match '^@(作|更)@.*?@_(.*)$') { exit 1 } else { exit 0 }"
        if !errorlevel! equ 1 (
            for /f "usebackq delims=" %%p in (`powershell -Command "$fn = '!filename!'; if ($fn -match '^@(作|更)@.*?@_(.*)$') { $matches[2] } else { $fn }"`) do (
                set "newname=%%p"
            )
            set "changed=true"
        )
        
        :: 末尾のマーカーも確認して除去(両方に付いている場合もあるため)
        powershell -Command "$fn = '!newname!'; if ($fn -match '^(.*)_@.*?@(作|更)@$') { exit 1 } else { exit 0 }"
        if !errorlevel! equ 1 (
            for /f "usebackq delims=" %%p in (`powershell -Command "$fn = '!newname!'; if ($fn -match '^(.*)_@.*?@(作|更)@$') { $matches[1] } else { $fn }"`) do (
                set "newname=%%p"
            )
            set "changed=true"
        )
        
        if "!changed!"=="true" (
            echo   %%F → !newname!!extension!
            set /a fileCount+=1
        )
    )
)

:process_confirmation
echo.
echo 合計 !fileCount! 個のファイルが変更対象です。
echo --------------------------------------------------

if !fileCount! equ 0 (
    echo.
    echo 変更対象のファイルがありません。
    pause
    goto :eof
)

echo.

:confirmation_prompt
set /p confirm="この名前変更処理を実行しますか? (Y/N): "
if /i "%confirm%"=="Y" (
    goto :start_processing
) else if /i "%confirm%"=="N" (
    echo 処理を中止しました。
    pause
    goto :eof
) else (
    echo 無効な入力です。Y または N を入力してください。
    goto :confirmation_prompt
)

:start_processing
echo.
echo 処理を開始します...
echo.

:: Reset processed file count
set processedCount=0

:: 実際の処理を実行
if "%modeChoice%"=="1" (
    :: 日付追加モード
    for %%F in (*) do (
        if not "%%~nxF"=="%~nx0" (
            set "filename=%%~nF"
            set "extension=%%~xF"
            
            :: 日付を取得(作成日または更新日)
            for /f "usebackq delims=" %%a in (`powershell -Command "(Get-Item '%%F').%dateTypeCmd%.ToString('!format!')"`) do (
                set "filedate=%%a"
            )
            
            :: 選択した位置に応じたファイル名の処理
            set "cleanedFilename=!filename!"
            set "hasDateMarker=false"
            
            if "%position%"=="1" (
                :: 先頭の日付マーカーをチェック (作 または 更)
                powershell -Command "$fn = '!filename!'; if ($fn -match '^@(作|更)@.*?@_') { exit 1 } else { exit 0 }"
                if !errorlevel! equ 1 (
                    set "hasDateMarker=true"
                    :: マーカー部分を削除
                    for /f "usebackq delims=" %%p in (`powershell -Command "$fn = '!filename!'; if ($fn -match '^@(作|更)@.*?@_(.*)$') { $matches[2] } else { $fn }"`) do (
                        set "cleanedFilename=%%p"
                    )
                )
            ) else (
                :: 末尾の日付マーカーをチェック (作 または 更)
                powershell -Command "$fn = '!filename!'; if ($fn -match '_@.*?@(作|更)@$') { exit 1 } else { exit 0 }"
                if !errorlevel! equ 1 (
                    set "hasDateMarker=true"
                    :: マーカー部分を削除
                    for /f "usebackq delims=" %%p in (`powershell -Command "$fn = '!filename!'; if ($fn -match '^(.*)_@.*?@(作|更)@$') { $matches[1] } else { $fn }"`) do (
                        set "cleanedFilename=%%p"
                    )
                )
            )
            
            :: 新しいファイル名の作成
            if "%position%"=="1" (
                set "newname=!prefixMarker!!filedate!!suffixMarker!_!cleanedFilename!!extension!"
            ) else (
                set "newname=!cleanedFilename!_!prefixMarker!!filedate!!suffixMarker!!extension!"
            )
            
            :: すでに日付マーカーがある場合はその旨を表示
            if "!hasDateMarker!"=="true" (
                echo %%F → !newname! [既存の日付を置換]
            ) else (
                echo %%F → !newname! を処理中...
            )

            ren "%%F" "!newname!"
            if !errorlevel! equ 0 (
                set /a processedCount+=1
            )
        )
    )
) else (
    :: 日付除去モード
    for %%F in (*) do (
        if not "%%~nxF"=="%~nx0" (
            set "filename=%%~nF"
            set "extension=%%~xF"
            set "newname=!filename!"
            set "changed=false"
            
            :: 先頭のマーカーを確認して除去(作/更の両方をチェック)
            powershell -Command "$fn = '!filename!'; if ($fn -match '^@(作|更)@.*?@_(.*)$') { exit 1 } else { exit 0 }"
            if !errorlevel! equ 1 (
                for /f "usebackq delims=" %%p in (`powershell -Command "$fn = '!filename!'; if ($fn -match '^@(作|更)@.*?@_(.*)$') { $matches[2] } else { $fn }"`) do (
                    set "newname=%%p"
                )
                set "changed=true"
            )
            
            :: 末尾のマーカーも確認して除去(両方に付いている場合もあるため)
            powershell -Command "$fn = '!newname!'; if ($fn -match '^(.*)_@.*?@(作|更)@$') { exit 1 } else { exit 0 }"
            if !errorlevel! equ 1 (
                for /f "usebackq delims=" %%p in (`powershell -Command "$fn = '!newname!'; if ($fn -match '^(.*)_@.*?@(作|更)@$') { $matches[1] } else { $fn }"`) do (
                    set "newname=%%p"
                )
                set "changed=true"
            )
            
            if "!changed!"=="true" (
                echo %%F → !newname!!extension! を処理中...
                ren "%%F" "!newname!!extension!"
                if !errorlevel! equ 0 (
                    set /a processedCount+=1
                )
            )
        )
    )
)

echo.
echo 処理完了: !processedCount! 個のファイルが実際に変更されました。
pause

バッチファイルの使い方

このバッチファイルの実行前には、念のため、バックアップをとってください

このバッチファイルは、以下の手順で使えます。

目的フォルダの中にバッチファイルを配置します

ファイル名を変更したいファイルが存在するフォルダの中にバッチファイルを配置します。

以下の例では、「テスト」フォルダの中にバッチファイル(ファイル名変更.bat)を置きました。

目的フォルダの中にバッチファイルを配置した状態(バッチファイル実行前)

バッチファイルをダブルクリックします

最初に、目的のフォルダ内にバッチファイルを配置したことを必ず確認してください。

意図しないフォルダの中でバッチファイルを実行すると、意図しないファイルの名前が変更されるので注意してください。

Windowsのシステムに関わるようなフォルダの中では、このバッチファイルを実行しないでください。システムに重要なファイルの名前が変更されると、Windowsの動作に影響を及ぼします。

今回の例では、以下のイラストのフォルダの中にバッチファイルを配置しました。

目的フォルダの中にバッチファイルを配置した状態(バッチファイル実行前)

処理を開始するには、上のイラストの状態で、バッチファイルをダブルクリックします。

バッチファイルをダブルクリックすると、以下のメッセージが出ます。

処理モードをユーザーに尋ねている状態

処理モード(日付追加)または(日付除去)を半角入力してからエンターキーを押します。

今回の例では、(日付追加)を入力します。

エンターキーを押すと、以下のメッセージが出ます。

日付のフォーマットを尋ねられている状態

日付のフォーマット(形式)が選択できます。

今回の例では、(YYYYMMDD)を入力します。

エンターキーを押すと、以下のメッセージが出ます。

追加する日付の種類を尋ねられている状態

追加する日付の種類が選べます。

今回の例では、(作成日付)を入力します。

エンターキーを押すと、以下のメッセージが出ます。

日付の追加位置を尋ねられている状態

日付の追加位置を選べます。

今回の例では、(先頭)を入力します。

エンターキーを押すと、以下のメッセージが出ます。

これから実施する処理の内容を表示している状態

このメッセージでは、これから行う処理の内容が表示されます。

よければ、Y(半角)を入力します。

エンターキーを押すと処理が始まり、以下のメッセージが出ます。

上のメッセージから実際の処理の内容処理ファイル数を確認できます。

実際のフォルダの中は、以下のようになります。

バッチファイル実行後

上のイラストのように、@作@YYMMDD@_ファイル名の形式で日付が追加されたことが確認できます。

基本的な操作は以上です。

作成日と更新日の追加

日付の形式

日付の形式は、以下の4つから選べます。

日付の形式

YYYYMMDD(年月日)

YYYYMMDDHH(年月日時)

YYYYMMDDHHMM(年月日時分)

YYYYMMDDHHMMSS(年月日時分秒)

日付追加後の形式

作成日付もしくは更新日付またはこれらの両方をファイル名に追加した場合、以下の形式になります。

日付追加後の形式

作成日を先頭または末尾に付加した場合

  @@YYMMDD@_ファイル名 または ファイル名_@@YYMMDD@

更新日を先頭または末尾に付加した場合

  @@YYMMDD@_ファイル名 または ファイル名_@@YYMMDD@

先頭と末尾の両方に日付を追加することもできます。

  例えば、更新日を先頭に追加し、作成日を末尾に追加した場合は、以下のようになります。

  @@YYMMDD@_ファイル名_@@YYMMDD@

  →このようにするには、バッチファイルを2回実施する必要があります。 

既に日付を含むファイル名のファイルに対する処理

既にこのバッチファイルで付与された日付を含むファイル名のファイルにこのバッチファイルの処理を適用した場合、該当する箇所(先頭または末尾)の日付が置換されます

例えば、@@YYMMDD_ファイル名に対して、先頭への作成日付の追加処理を実施した場合、ファイルの名前は、@@YYMMDD_ファイル名になります。

もう一つ例を挙げます。

@@YYMMDD_ファイル名のファイルを更新後に、先頭への更新日付の追加処理を実施した場合、形式は変わらずに@@YYMMDD_ファイル名となりますが、YYMMDDの部分が新しい更新日付になります。

処理対象

ファイルの種類を問わずバッチファイルがあるフォルダの中のすべてのファイルが処理対象になります

但し、隠しファイルバッチファイル自体は処理の対象になりません

作成日と更新日の削除

処理モードをユーザーに尋ねている状態

上のイラストの段階で(半角)を入力すると、そのフォルダの中にあるすべてのファイルから日付部分を除去できます

例えば、以下のような挙動になります。

削除処理時のファイル名の変化

@作@YYMMDD@_ファイル名ファイル名

ファイル名_@更@YYMMDD@ファイル名

@更@YYMMDD@_ファイル名_@作@YYMMDD@ファイル名

@作/更@YYMMDD@の形式部分が認識されて削除処理が行われます。

@作/更@YYMMDD@_ファイル名」の形式を「YYMMDD_ファイル名」にしたい場合

人によっては、@作/更@YYMMDD@_ファイル名の形式から余分な部分(@または)を除去して、シンプルにYYMMDD_ファイル名としたい方もいるかもしれません。

そのような場合は、以下のバッチファイルを使って、ファイル名から不要な文字列を除去してください。

ファイル名の一部のみを一括変更するバッチファイル置換後文字列空白にすると指定の文字列を削除できます)

セキュリティソフトによって処理が遮断された場合

パソコンの環境によっては、セキュリティソフトによって処理が一時的に遮断され、以下のようなメッセージ(一例です)がでる場合があります。

セキュリティソフトによってバッチファイルの処理が遮断された場合に出るメッセージの例

このような場合は、「アプリを許可する」を選んでください。

(メッセージや、アプリの許可操作は、セキュリティソフトによって異なります)

その他の関連バッチファイル

もしご興味があれば、以下のバッチファイルもご覧ください!

陰キャくじら
陰キャくじら

ファイル名を一括で変更するバッチファイルこちら

ファイルの拡張子を一括で変更するバッチファイルこちら

ファイル名の一部を一括で変更/削除するバッチファイルこちら

ファイルを種類ごとに自動でフォルダ分けするバッチファイルこちら

ファイル名の先頭/末尾の文字列を追加/削除するバッチファイルこちら

パソコンデータをミラーリングしてUSBメモリにバックアップするバッチファイルこちら

【スポンサーリンク】

-バッチファイル
-, ,