スポンサーリンク

バッチで,複数ファイルを一括で「連番リネーム」するサンプルコード (写真や画像ファイルをフォルダ内で自動ナンバリングし,簡単に整理)

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