BETA

ファイル名を一括変更するバッチを作ってみた

投稿日:2018-11-27
最終更新:2018-12-14

こんにちは。

なんだか急にファイル名を一括で変換したい。

ってことありませんか?

たとえば

写真をパソコンに取り込んだり、 仕様書、テストのエビデンスのためのスクリーンキャプチャを大量に取った時ですよね。 他にもあると思いますが。

そんなの便利なフリーソフトを使えばいいじゃん。
って思う方もいらっしゃるかと思いますが、
フリーソフトって、セキュリティ的なあれでインストール出来ない時もありませんか?

そんな時は、Windwos の機能を使って賢く変換しましょう。

DOSコマンドを利用して一括変換するぜ!

現在のように、マウスを使って操作ができるようになる前は 全ての操作をコマンド(命令)を入力することで行っていました。

この機能は今でも標準で使えるようになっており、
コマンドをどういう順番で、どういう条件で実行するか。
という情報をまとめたファイルを作ると、色々と便利なことができます。
(このファイルをバッチファイルと呼びます)

詳しいことは「Windows バッチ」や、「Windows DOS コマンド」と検索していただければ。

ソースコード

次のコードをコピーして、 メモ帳やエディタソフトなどに張り付け、「xxxxx.bat」という名前で保存します。
@echo off  
REM -----------------------------------------------------------------------------------------  
REM ファイル名変換バッチ  
REM -----------------------------------------------------------------------------------------  
REM 概要:   
REM       実行ファイルと同じディレクトリに存在するファイルの名前を  
REM       指定した文字列+インデックスに置き換えます。  
REM -----------------------------------------------------------------------------------------  
REM -------------------------------------------------  
REM 変数  
REM -------------------------------------------------  
SET BATCHNAME=%~n0  
SET YMD=%date:~-10,4%%date:~-5,2%%date:~-2,2%  
SET LOGFILE=%BATCHNAME%_%YMD%.log  

REM * =========================================================================================================
REM * 処理開始
REM * =========================================================================================================
:LA_STARTBATCH

cls
ECHO =========================================================================================
ECHO  ファイル名変換バッチ
ECHO.
ECHO -----------------------------------------------------------------------------------------
ECHO  実行ファイルと同じディレクトリに存在するファイルの名前を
ECHO  指定した文字列+シーケンス番号に一括で置き換えます。
ECHO.
ECHO  ※シーケンスは最大9桁までとしています。
ECHO  ※ファイル名の昇順で処理されます。
ECHO.
ECHO =========================================================================================
ECHO.
SET /p idir=処理するディレクトリのパスを入力(または [c] キャンセル)⇒
IF '%idir%'=='c' GOTO LA_ENDBATCH
SET DIRPATH=%idir%

IF '%idir%'=='' (
SET DIRPATH=%CD%
)

ECHO.
SET /p ifile=新しいファイル名を入力(または [c] キャンセル)⇒
IF '%ifile%'=='c' GOTO LA_ENDBATCH
IF '%ifile%'=='' GOTO LA_STARTBATCH
SET FNAME=%ifile%

ECHO.
SET /p seq=ファイルに付与するシーケンス桁数を入力(または [c] キャンセル)⇒
IF '%seq%'=='c' GOTO LA_ENDBATCH
REM コマンドチェック
CALL :LA_INPUT_CHECK %seq% 123456789
IF '%seq%'=='' GOTO LA_STARTBATCH
SET DIGITS=%seq%

REM 作業フォルダに移動
IF NOT EXIST %DIRPATH% (
ECHO 指定されたディレクトリは存在しません。
GOTO LA_STARTBATCH
)
CD %DIRPATH%
ECHO [%DATE% %TIME%] バッチ処理開始 > %LOGFILE%
ECHO. >> %LOGFILE%
ECHO %DIRPATH% >> %LOGFILE%
ECHO 上記ディレクトリ内にあるファイルの名前を %FNAME% に %DIGITS% 桁のシーケンスを加えたものに変換します。 >> %LOGFILE%
ECHO.
ECHO %DIRPATH%
ECHO 上記ディレクトリ内にあるファイルの名前を %FNAME% に %DIGITS% 桁のシーケンスを加えたものに変換します。
ECHO.
SET /p confirm=よろしいですか?[ y / n ]⇒
CALL :LA_INPUT_CHECK %confirm% yn
IF '%confirm%'=='n' GOTO LA_CANCELL

ECHO.
ECHO スタート!
setlocal enabledelayedexpansion
SET CNT=0
FOR /R %%A IN (*) DO (
SET NM=%%~nA
IF NOT '%%~xA'=='.log' (
IF NOT '%%~nA'=='%BATCHNAME%' (
CALL :LA_ZEROPAD !CNT!
REM ECHO !FNAME!!ZPRET!%%~xA
ECHO %%~fA → %%~dpA!FNAME!!ZPRET!%%~xA
ECHO %%~fA → %%~dpA!FNAME!!ZPRET!%%~xA >> %LOGFILE%
REN "%%~fA" "!FNAME!!ZPRET!%%~xA"
SET /a CNT=!CNT!+1
)
)
)
ECHO コンプリート!

echo.
GOTO LA_ENDBATCH

EXIT /B

REM * =========================================================================================================
REM * ゼロ埋め
REM * =========================================================================================================
:LA_ZEROPAD
SET NUM=%1
SET ZPRET=

REM 繰り返し処理
:LA_ZEROPADLOOP
CALL :LA_STRLEN %ZPRET%%NUM%
if %LEN% lss %DIGITS% (
SET ZPRET=0%ZPRET%
goto LA_ZEROPADLOOP
)
SET ZPRET=%ZPRET%%NUM%

EXIT /b

REM * =========================================================================================================
REM * 文字数取得
REM * =========================================================================================================
:LA_STRLEN
SET SLRET=%1
SET LEN=0

REM 繰り返し処理
:STRLENLOOP
IF NOT "%SLRET%"=="" (
SET SLRET=%SLRET:~1%
SET /a LEN=%LEN%+1
GOTO :STRLENLOOP
)

EXIT /b

REM * =========================================================================================================
REM * コマンドチェック
REM * =========================================================================================================
:LA_INPUT_CHECK
ECHO %2 > tmp.text
SET RET=
FOR /F "usebackq" %%t IN (findstr %1 tmp.text) DO SET RET=%%t
DEL tmp.text
if '%RET%'=='' (
GOTO LA_INPUT_MISSING
)

EXIT /b

REM * =========================================================================================================
REM * エラー処理
REM * =========================================================================================================
:LA_ERROR
echo.
echo エラーが発生しました。
echo.
goto LA_ENDBATCH

REM * =========================================================================================================
REM * 処理中止
REM * =========================================================================================================
:LA_CANCELL
ECHO.
ECHO 処理は中止されました。
ECHO.
GOTO LA_ENDBATCH

REM * =========================================================================================================
REM * 入力ミス
REM * =========================================================================================================
:LA_INPUT_MISSING
ECHO.
SET /p miss=入力に誤りがあります。
GOTO LA_STARTBATCH

REM * =========================================================================================================
REM * バッチ終了処理
REM * =========================================================================================================
:LA_ENDBATCH

ECHO. >> %LOGFILE%
ECHO [%DATE% %TIME%] バッチ処理終了 >> %LOGFILE%
ECHO.
SET /p end=終了するにはEnterキーを押してください...

EXIT


何ができるのか

指定したディレクトリ内にあるファイルのファイル名を一括で変換します。 (ファイル名昇順で番号を振ります) 変換時に指定できるのは、「ファイル名」と「シーケンス桁数」となってます。

例えば、ファイル名を「TEST」、シーケンス桁数を「3」とした場合、次のように変換されます。

A.text → TEST000.text
B.text → TEST001.text
C.text → TEST002.text
実行ファイル、および .log ファイルについては対象から除外してあります。

使い方

起動すると

「処理するディレクトリのパスを入力(または [c] キャンセル」と表示されるので、
一括変換したファイルが入っているディレクトリのパスを入力します。
コピーしてペーストすると間違いがないのでお勧めします。

ちなみにコマンドプロンプト上でペーストするには次のようにします。

  1. マウスを使って普通に張り付ける コマンドプロンプト上で右クリックをすればできます。
  2. ショートカットでかっこよく張り付ける フォーカス(全面に表示され、アクティブになっている)されている状態で、 「ALT」+「SPACE」→「E」→「P」とするとかっこよくペーストできます
続いて、「新しいファイル名を入力(または [c] キャンセル」と表示されるので ファイル名を入力して Enter を押してください。

最後に、「ファイルに付与するシーケンス桁数を入力(または [c] キャンセル」と表示されるので
ファイル名の後ろにつける番号の桁数を入力し、 Enter を押してください。

処理対象の確認メッセージが表示されるので、問題がなければ「y」を入力して
Enter を押してください。

エラーもなく、
「終了するにはEnterキーを押してください...」が表示されれば完了です。

お断り

対象のディレクトリにあるファイルを、ファイル名の昇順で変換していきます。

ファイルを消したりとかはしないので、最悪のことは起きないと思いますが
ファイル名が思ったように変換されなかった等の苦情は受付ませんのでご了承願います。

プログラムについて、こうした方がいい、間違っているなどの情報はありがたく頂戴します。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@doraxdoraの技術ブログ 主に Java, C#, Python, Javascript の記事を載せていく予定。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう