モーリーのメモ

アプリ開発等(プログラミング、CG作成)、興味を持ったことを実践してまとめるブログです。

モーリーのメモ

"ファイル名で"ファイル名を一括で置換する!:バッチファイル(.bat)

 バッチファイルと同一フォルダ内にある複数のファイルの名前を一括で置換します。
 置換する文字列は、バッチファイルのファイル名で指定します。
 
 *使用している様子のGIFアニメです。クリックで再生(ループ)します。


     バッチファイルを実行して、同一フォルダ内のファイル名を一括で置換しています。

     置換する文字列は、バッチファイルの名前で指定します。
     ファイル名は『Replace@(置換前の文字列)@(置換後の文字列).bat』となっています。  例:『あいうえお.txt』を『あい上お.txt』としたい場合は、『Replace@うえ@上.bat』

     なお、『置換後の文字列』がない場合は、『置換前の文字列』を削除する処理になります。
 
 バッチファイル(.bat)は、コマンドプロンプトのコマンドを記述したテキストファイルです。メモ帳で書いて、拡張子を『.bat』にして保存するだけで作成できます。

使用環境

 私が使用している環境です。

バッチファイルを作る

バッチファイルの作り方

 バッチファイルはメモ帳で書いて、拡張子を『.bat』して保存することで作成できます。
 こちらの記事で作り方を説明しています。

バッチファイルの中身

 下記のコードをメモ帳に貼り付けてください。
 ファイル名は『Replace@(置換前の文字列)@(置換後の文字列).bat』にして下さい。
 @は半角のアットマークです。区切り文字は『delims=@』の部分で変更します。
 例:『Replace@はてな@Hatena.bat』にするとファイル名の"はてな"を"Hatena"に置換します。

    @echo off
    rem ↑実行したコマンドを画面に表示しない
    
    rem 文字コードをUTF-8に設定
    chcp 65001
    
    rem バッチファイル自体のファイル名(拡張子なし)を取得
    set OWN_FILE=%~n0
    
    rem バッチファイル名を"@"で分割して置換前と置換後の文字列を取得する
    for /f "delims=@ tokens=2,3" %%a in ("%OWN_FILE%") do (
    
     rem 置換前の文字列を取得
     set OLD_STR=%%a
    
     rem 置換後の文字列を取得
     set NEW_STR=%%b
    )
    
    rem フォルダ内のファイル数分ループ
    for %%f in ( * ) do (
    
     rem ファイル名を引数としてサブルーチンを呼び出す
     call :sub "%%f"
    )
    
    rem メインルーチンを終了
    exit /b
    
    
    rem サブルーチンを定義
    :sub
    
    rem 引数からファイル名を取得
    set FILE_OLD=%1
    
    rem 文字列を置換
    call set FILE_NEW=%%FILE_OLD:%OLD_STR%=%NEW_STR%%%
    
    rem バッチファイル自体ではない場合
    if not "%OWN_FILE%" == "%~n1" (
    
     rem ファイル名を変更
     ren %FILE_OLD% %FILE_NEW%
    )
    
    rem サブルーチンを終了
    exit /b
    

やっていること

  1. ファイル名を”@”で分割して2番目と3番目文字列を取得します。
    バッチファイルのファイル名は下記のようになっています。
    『Replace@(置換前の文字列)@(置換後の文字列)』
  2. バッチファイルと同じフォルダにあるファイルの数だけ、サブルーチンを繰り返し呼び出します。
    サブルーチンには引数としてファイル名を渡します。
  • サブルーチン
    引数で受け取ったファイルの名前を指示通り置換して、ファイル名を変更します。
    バッチファイル自体の名前は変更しないようにしています。

文字列の分割について

 文字列の分割は下記のようなfor文で行います。

    echo off
    rem ↑実行したコマンドを画面に表示しない
    
    rem 文字コードをUTF-8に設定
    chcp 65001
    
    rem 分割する文字列
    set STRING=はてな_ブログ_ドット_コム
    
    rem 文字列を"_"で分割して、1~4番目の要素を取り出し、結果を変数aから順に格納する
    for /f "delims=_ tokens=1-4" %%a in ("%STRING%") do (
     rem 1番目の文字列を取得する
     set STR_1=%%a
     rem 2番目の文字列を取得する
     set STR_2=%%b
     rem 3番目の文字列を取得する
     set STR_3=%%c
     rem 4番目の文字列を取得する
     set STR_4=%%d
    )
    
    rem 結果を出力する
    echo STR_1=%STR_1%
    echo STR_2=%STR_2%
    echo STR_3=%STR_3%
    echo STR_4=%STR_4%
    
    rem 結果を見るために一時停止する
    pause
    
    rem 実行結果
    rem STR_1=はてな
    rem STR_2=ブログ
    rem STR_3=ドット
    rem STR_4=コム
    

  • 設定値について
    設定意味
    delims=_"_"を区切り文字とします。区切り文字はここで変更します。
    tokens=1-4分割した結果の1~4番目の文字列を取得します。
    %%a%%aに1番目の文字列、%%bに2番目の文字列といったようにアルファベット順に
    格納されます。『%%i』と設定した場合は%%iに1番目の文字列が入ります。

現在のフォルダのファイル名を取得する

 下記のfor文は現在のフォルダにあるファイルの数だけループします。
 ループするごとに各ファイルの名前を順次『%%f』に格納します。
 『*』の部分を『*.txt』とするとテキストファイル(.txt)だけが対象となります。

    @echo off
    rem ↑実行したコマンドを画面に表示しない
    
    rem フォルダ内のファイル数分ループ
    for %%f in ( * ) do (
    
     rem ファイル名を表示する
     echo %%f
    )
    
    rem 結果を見るために一時停止する
    pause
    

文字列の置換について

 文字列の置換は下記のように行います。
 置換前の文字列は、大文字と小文字が区別されません。
 下記のコードでは、置換前の文字列は"HATENA"ですが、Hatena"の部分が置換されます。

    @echo off
    rem ↑実行したコマンドを画面に表示しない
    
    rem 文字コードをUTF-8に設定
    chcp 65001
    
    rem 元の文字列
    set ORIGINAL=HelloHatenaBlog
    
    rem 置換前の文字列
    set OLD=HATENA
    
    rem 置換後の文字列
    set NEW=はてな
    
    rem 文字列を置換
    call set RESULT=%%ORIGINAL:%OLD%=%NEW%%%
    
    rem 結果を出力する
    echo %RESULT%
    
    rem 結果を見るために一時停止する
    pause
    
    rem 実行結果:HelloはてなBlog
    

 
今回は以上です。お疲れさまでした。

おすすめ・関連する記事