ファイル名を 日付が付与された形に一括リネームするバッチ


概要

ファイルをコピーしたり転送するうちに、更新日時が変化してしまい、
どのファイルが新しいものか分からなくなってしまった
という経験はありませんか。

あるファイルがいつのものか判るようにするための
最もシンプルな方法は、ファイル名に日時やバージョン番号を入れる事です。

このバッチファイルは、
指定したディレクトリに含まれるファイルの名前に、当該ファイルの更新日時を付加します。

例)
scoresheet.xlsx ⇒ scoresheet_20190531-1245.xlsx

環境

Windows 10, 7

使用方法

  • ファイル名に、更新日時の日付と時刻両方を追加したい場合は "AppendDateTime.bat" を、日付のみ追加したい場合は、AppendDate.batを使用します。
    一つに統一しました。既定では、ファイル名に日付のみ追加されます。

  • オススメの使用方法は、「送る」メニューにショートカットファイルを登録しておき、リネームしたいファイル自体またはファイルを格納したフォルダを右クリックして「送る」メニューから使用することです。

  • 通常の使用方法は、リネームしたいファイル自体またはファイルを格納したフォルダを選択し、上記いずれかのバッチファイルにDrag&Dropします(ファイルまたはフォルダのパスが引数に指定されてバッチが起動します)。

  • ファイルへのD&Dが困難な場合は、バッチファイルを単体で起動するとフォルダパスの入力を求められるため、ファイルまたはフォルダをD&Dして [Enter]キーを押下します。ファイルパス(改行区切りで複数可能)をペーストする方法もあります。

  • ファイル名に更新日時の日付と時刻両方を追加したい場合は、第1引数に "/T-"を指定します(引数の3文字目 '-' が日付と時刻の区切りとして使用されます)。さらに対象フォルダを指定して起動したい場合は、フォルダパスが第2引数になるようにします。

注意

  • リネームされるのは、指定したディレクトリ直下のファイルのみとなります。
  • バッチファイルの構文解析の仕様上、ファイル名中の記号によっては正しく処理できない可能性があります。
  • ファイルに対しての変更はリネームコマンドしか使用していないため、ファイルの上書きは起こらず、基本的にデータが消失する事はありません。
  • 但し、ファイル管理が特殊な環境の場合はご注意願います。万が一ファイルを紛失されても、筆者では補償は一切致しかねます。

ソースファイル

「マジック生成」するには、本ページ全体を選択してコピー後にB642FHT.batを起動して下さい。
その後、生成したZIPファイルを解凍して任意の場所へ配置して下さい。

興味ある方は、以下のコードをご覧ください。

コード

AppendTS.bat
@ECHO OFF
COLOR 0A

ECHO ############# AppendTS.bat #############
ECHO # Append the date ^& time               #
ECHO #                    to filename batch #
ECHO #                                      #
ECHO #   1st release: 2019-05-30            #
ECHO #   Last update: 2019-07-13            #
ECHO #   Author: Y. Kosaka                  #
ECHO #   See the web for more information   #
ECHO #   https://qiita.com/x-ia             #
ECHO ########################################

SET tScr=%~n0
SET dScr=%~dp0
SET extLog=.log
SET tSearch=.

:option
SET opt=""
SET tSep=
SET arg="%~1-"
IF %arg% NEQ "" (
  IF "%arg:~1,1%" EQU "/" (
    SET opt="%arg:~1,2%"
    SET tSep=%arg:~3,1%
    SHIFT
  )
)
:loop
SET pInput=
CALL :indir %1
SHIFT
IF %pInput: =% EQU "" GOTO eof
IF NOT DEFINED pInput GOTO eof
IF NOT EXIST %pInput% (
  ECHO File not exists.
  GOTO loop
)

CALL :isfile %pInput%
IF %flagFile% EQU 1 GOTO tgtfile


:tgtdir
PUSHD %pInput%
SET dTgt=%pInput%\

SET nLineMax=0
FOR %%A IN (*.*) DO (
  SET /A nLineMax+=1
)
SET nLine=0
FOR %%A IN (*.*) DO (
  CALL :gettime "%%A"
  CALL :divname "%%A"
  CALL :renfile
)
ECHO.
POPD
GOTO loop
EXIT /B


:tgtfile
CALL :getdir %pInput%
PUSHD %dInput%
SET dTgt=
SET /A nLineMax+=1
CALL :gettime %pInput%
CALL :divname %pInput%
CALL :renfile
ECHO.
POPD
GOTO loop
EXIT /B


:isfile
SET tAttr=%~a1
IF "%tAttr:~0,1%" EQU "d" (
  SET flagFile=0
) ELSE (
  SET flagFile=1
)
EXIT /B


:indir
ECHO.
IF "%~1" NEQ "" (
  SET pInput=%1
) ELSE (
  ECHO Current directory = %~dp0
  ECHO.
  ECHO Enter the folder path within files to rename.
  SET /P pInput=folder path= 
)

SET pInput="%pInput%"
SET pInput="%pInput:"=%"
ECHO Input folder:
ECHO %pInput%

IF %pInput: =% EQU "" EXIT /B
ECHO "%pInput%" | FIND /I "\" >NUL
IF ERRORLEVEL 1 SET pInput=%~dp0%pInput%
SET pInput="%pInput:"=%"

EXIT /B


:getdir
SET dInput="%~dp1"
EXIT /B


:gettime
SET tName="%~1"
FOR /f "usebackq delims=" %%i IN (`DIR %dTgt%%tName:^^=^% ^| FINDSTR \/`) DO SET tTs=%%i
SET tDate=%tTs:~0,10%
SET tDate=%tDate:/=%
SET tDate=%tDate:-=%
SET tTime=%tTs:~12,8%
SET tTime=%tTime::=%
IF %opt% EQU "" (
  SET tTime=
)ELSE IF %opt% NEQ "/S" (
  SET tTime=%tTime:~0,4%
)
SET tFTime=%tDate%%tSep%%tTime%
EXIT /B


:divname
SET tName=%~n1
SET tExt=%~x1
SET flag=
EXIT /B


:renfile
ECHO %tName:^^=^%%tExt% -^> %tName:^^=^%_%tFTime:"=%%tExt%
REN "%tName:^^=^%%tExt%" "%tName:^^=^%_%tFTime:"=%%tExt%"
SET err=%ERRORLEVEL%
IF %err% EQU 0 (
  SET /A nLine+=1
)
TITLE %tScr% %nLine%/%nLineMax%
ECHO %date% %time%     %tScr%    %err%    %tName:^^=^%    %tFTime:"=%    %tExt%>>%dScr%\%tScr%%extLog%
EXIT /B


:eof
ECHO Terminated. 
TIMEOUT /T 2
EXIT /B

バイナリ (Base64 encoding)

AppendTS.zip
---
UEsDBBQAAAAIAHR37U597qthPgQAAP8KAAAMAAAAQXBwZW5kVFMuYmF0jVZtj9pG
EP6OxH8YbbVVSION71q1teRT6WF6qA6+gK9qpRONDy9gBWzHXhoqRffbM/viV7go
FhLemWdmn5239W/u7Z0P/nTa7936nr+A0bjf6/ek9LvmA+MsY0kULI2nkLdVJVxD
gO8YRCFnsPoeeHxg0H5q/IWHp7CJ9ywJ0Qw3Wu++Dj9/mnCr4JCzPQsLZsPVyPp1
OPppeD16Ce6FiD9mgnoJ/3loXb8EHx/5Ls1t+MeAP9Mi/BDC2dOELxmTkfnEnmCT
5nBIcwZxgq+HkMdp0oHvOM8K2zQ/xjEPjXV6ME/DuL1FBf/GRyR26QbAl+vcoc/J
SC0jtYwyvWYn7qVbx9in2xLPwny9cwzhwE4zwVZp8N0hpEJljnoN861D6LM1RNVs
ChTXFObuOyAEXvV7ACgkQmo/W28sSsB99wDE1EoMVem6xFxRUmvkRkpzjdZacTeb
BuJ10O/hz96naabIZLMkO3Jkdjv2PLDjJIpzoBYqlYkgqDA2OFRRIfCHH/jA0o3U
z/0AJu50Nncn2t253v17tgxKT1SdRGZniuUMScoxrnHBC0MopLWiOBBB1dQKUfqV
D0Vtsw+3woViZilTvuUCKkzxrLjCM/V79w/Lu0nDXCY32HKnFD2WFZB4ccLehicH
Uz7Fpqd0DLM5vHptvB7AxFfsBdAcV9gfHEuyrey/aqxOtGVcDgCCGFKLo/g/2eAd
cc4SdaqBKmwM1b1/P+n3GuHCMCOr3+uTK4tqO5ncKgI6ItFZRNRr93Rt0rWbNuuu
vKL9bZxVlnXPjDkXvRdaMtmESoH9PKq7IiJ1NspaEJEfgOst3Qs6laXOnoksEE1Q
7vRskVZLNlpFNEfTvSzj22OOB+WAjtiap/n/4IAeGgphVFA34SyXs26T7iN8zUK+
g08x38WJnO6FGPO5HPJGVWn35fYNIwd0gzTYkTL+5KLYJo7QSCKqVZU/W8vq7L3U
+lXoJL7eDj4DjoAJmDMgjwRu5g+edOEuFv7Cc/9yPWzPZhhFdNrdeJlrN1uqjHW1
lhbozCIXkKJUdTHNMZ5y7hLVmOYGyLFgT+H6w0eI2D4+FA7Bdo1lu76fzLB3RTdQ
Kk3t1cpZUVipYy6DBTya72VHS+9B4aCp3mqCd6RDUSZrdUTbYvFnm84l6bCSBkhc
u7Cu3vzSFeOfbTt6COJlUKWnqlYFxQKRlVrBZFGbyzOg9ol8f6TVIONTrRPkMA54
tVAFpN1Y6/ZvxhrvUEuv3ZNI+EkvRTM60qrYxRuu7LoOW3MDmjmgwh2F4eqmJf6X
KrqibBSk31u4czE2urakLTy31M3Dchw/dQHrcKNUhXt0fhOU10AwCzwX6eHHAwUq
VdSk5Til5anExxTqRZVS+dGiLcSb3EaKGuUn1xVZtRSEb26o+FChj8oBVV8pZ1mS
V7LcOmD5IU5w+8gAQfet6z8gMICrhs0XUEsBAhQAFAAAAAgAdHftTn3uq2E+BAAA
/woAAAwAAAAAAAAAAQAgAAAAAAAAAEFwcGVuZFRTLmJhdFBLBQYAAAAAAQABADoA
AABoBAAAAAA=
---