バッチで,複数ファイルを一括で「連番リネーム」するサンプルコード (写真や画像ファイルをフォルダ内で自動ナンバリングし,簡単に整理)
Windowsバッチで,複数ファイルを一括でリネームするサンプルコード。
フォルダ内の全ファイルについて,
連番をつけながら自由に名称変更できる。
デジカメの画像・写真などの整理に便利。
マッチ対象のファイルパターンや,リネーム方法などは
正規表現で自由に組み替えられる。
ナンバリングは必須ではなく,番号なしでリネームすることもできる。
対象のフォルダ内に下記のバッチファイルを置いて,ダブルクリックするだけ。
_リネーム.bat
@if(0)==(0) ECHO OFF rem このバッチのあるフォルダをカレントとしてWSHを実行 cscript.exe //nologo //E:JScript "%~f0" %0\.. @pause GOTO :EOF @end // 共通関数 // デバッグ出力 function log(s){WScript.Echo(s);} // 正数を指定桁に0埋め Number.prototype.zero_padding = function( digit_num ){ // 整数化 var num = parseInt( this, 10 ); // 0埋めの必要がない場合 if( ( "" + num ).length >= digit_num ){ return ( "" + num ); } // 指定した条件まで0埋め var continue_flag = true; var zeros = "0"; while( continue_flag ){ if( ( zeros + num ).length >= digit_num ){ continue_flag = false; }else{ // 0を付け足す zeros += "0"; } } return zeros + num; }; // メイン処理 log("カレントフォルダ内でリネームします。"); // このバッチのあるフォルダ var current_dir_path = WScript.Arguments(0); // カレントフォルダを変更 WScript.CreateObject("WScript.Shell").CurrentDirectory = current_dir_path; //log( "現在のカレントディレクトリ:" // + WScript.CreateObject("WScript.Shell").CurrentDirectory ); // このフォルダ内のファイルを全取得 var fso = WScript.CreateObject("Scripting.FileSystemObject"); var folder = fso.GetFolder( current_dir_path ); var enumerator = new Enumerator( folder.Files ); // 配列に移し変えて名前順にソート var arr = []; for ( ; ! enumerator.atEnd(); enumerator.moveNext() ){ arr.push( enumerator.item() ); } arr.sort(function(item1, item2){ return ( item1.Name > item2.Name ); }); // 一つずつ処理 var cnt = 1; for ( var i = 0; i < arr.length; i ++ ){ // このファイルの名前 var item = arr[i]; var file_name = item.Name; // マッチするものに絞り込む // // ★マッチ条件は適宜書き換える // var m; if( m = file_name.match(/^.+\.png$/) ){ log( "リネーム対象:" + file_name ); // キャプチャ括弧の参照 //log( m[1] + ", " + m[2] ); // 新ファイル名 // // ★リネーム方法は適宜書き換える // var new_file_name = "photo_" + cnt.zero_padding(3) + ".png" ; //log( new_file_name ); // リネーム実行 item.Name = new_file_name; log( "リネームしました。" + new_file_name ); // 連番をインクリメント cnt ++; } } log("全リネーム完了");
★マークの付いた2箇所を書き換えれば,自由に処理を変更できる。
一つ目の★では,リネーム対象のファイルパターンを設定している。
/^.+\.png$/ とすれば,拡張子が .png のもののみリネーム対象となる。
二つ目の★では,リネーム後のファイル名を設定している。
ここで cnt.zero_padding(3) とすれば,連続した番号を3桁に0埋めして付与できる。
冒頭のサンプル写真のような状態でバッチを実行すると,下記のように出力される。
カレントフォルダ内でリネームします。 リネーム対象:DSC2019.png リネームしました。photo_001.png リネーム対象:DSC2030.png リネームしました。photo_002.png リネーム対象:写真2010.png リネームしました。photo_003.png リネーム対象:写真2012 - コピー (4).png リネームしました。photo_004.png リネーム対象:写真2012.png リネームしました。photo_005.png リネーム対象:写真2014.png リネームしました。photo_006.png リネーム対象:写真2018.png リネームしました。photo_007.png リネーム対象:写真2019.png リネームしました。photo_008.png リネーム対象:写真2030.png リネームしました。photo_009.png 全リネーム完了 続行するには何かキーを押してください . . .
これがあれば,ファイルの整理が非常に楽。
とくに正規表現の「キャプチャ括弧」を使えば,複雑なリネームをすることもできて便利だ。
※正規表現の複雑な使い方は,下記のエントリを参照。
あなたが正規表現の中級者か判別する10問テスト (文字列処理の必須知識)
http://language-and-engineering.hatenablog.jp/entry/20131028/RegExpProgrammin...
- あなたが,正規表現を扱うプログラマーとして,中級以上の実力を持っているかどうか判定します。 下記に,正規表現に関する10問の質問があります。 いずれも,「文字列を処理する実用的なプログラム」を書く上で必要な知識です。
参考
基本的なコードの意味:
BATとWSHのコードを1ファイルに混在させるためのshebang記法(複雑なバッチを1ファイルで実現)
http://computer-technology.hateblo.jp/entry/20131025/p1
- WSH/JScriptバッチのコードを,単一のBATファイルの中に埋め込むことが可能。 つまり,複雑なバッチを1ファイルで実現できる。
ファイルの一覧やファイル数を取得する - Files [Scripting.Folder] - VBScript Tips [VBA/Access/Excel対応]
http://www.happy2-island.com/vbs/cafe...
- フォルダ内のファイル一覧を取得する
objFolder = objFileSys.GetFolder(strTargetPath);
objEmu = new Enumerator(objFolder.Files);
for (; !objEmu.atEnd(); objEmu.moveNext()) {
現在のディレクトリ(カレントディレクトリ)を取得する - WScript.ShellとCurrentDirectory [VBScript Tips]
http://www.happy2-island.com/vbs/cafe...
var objWshShell = new ActiveXObject("WScript.Shell");
objWshShell.CurrentDirectory
VBScriptと異なり,WSH/JScriptには for in 構文がないため,
Enumeratorでファイル一覧のコレクションを操作する。
この際にフォルダオブジェクトから .Files しても,ファイル一覧は名前順には取得できない。
そのため,自力で配列にコピーしてソートしている。
Microsoft Windows 2000 Scripting Guide - Enumerating the Files in a Folder
https://technet.microsoft.com/en-us/l...
- As with most collections, you have no control over the order in which information is returned;
- that is, you cannot specify that files be sorted by name, by size, or by any other criteria.
- If you want to sort the file collection in a particular way, you need to copy the collection to an array, a Dictionary, or a disconnected recordset and then sort the items.
関連する記事:
BATのforループで,「0埋めされた数値」を連番で出力しよう (環境変数の遅延展開と,数値の大小比較判定の方法)
http://language-and-engineering.hatenablog.jp/entry/20131116/BATLoopNumberInc...
JavaScriptの動かないコード (中級編) 正規表現で同じ文字の連続を検出したい - 置換前パターン中での後方参照
http://language-and-engineering.hatenablog.jp/entry/20080927/1222508705
bat中でforループをネストし,サブルーチンを呼び出して,条件付きファイル検索の結果を一斉コピーしよう (ファイル名の重複防止機能付き)
http://language-and-engineering.hatenablog.jp/entry/20111030/p1
UTF8Nの複数テキストを,一斉に置換するバッチ (JScriptでUTF8Nのファイルを読み書き)
http://language-and-engineering.hatenablog.jp/entry/20090723/p1
Windowsで,簡単にファイルを「ごみ箱」に送るバッチのサンプルコード。削除処理に「シェル名前空間」を使う仕組みの解説
http://language-and-engineering.hatenablog.jp/entry/20150528/WindowsBatSendFi...
「カウントダウン後,定期的に動くタイマー」をBATだけで作る方法 (リアルタイムで残り秒数を表示し,処理を定期実行)
http://language-and-engineering.hatenablog.jp/entry/20140918/BATCountDownTimer
SQLで,テーブルに存在しない複数行のデータを取得する方法 (PostgreSQLの generate_series関数をマスターしよう)
http://language-and-engineering.hatenablog.jp/entry/20100309/p1