連番ファイル名の数字部分の桁数を変更するスクリプト

スクリプトの作成と実行は各自の責任の元で行っていただきますようお願いします。


連番ファイル名
000.xxx
001.xxx
002.xxx
等のファイル名の数字部分の桁数を0パディング(0サプレス)か切り落として
指定した桁にそろえます。


たとえば桁数に5, 拡張子をxxxとすれば上記のファイル名は
00000.xxx
00001.xxx
00002.xxx
となります。


プリフィックスサフィックスがついていても大丈夫です。
ABC_000.xxx
ABC_001.xxx
ABC_002.xxx

ABC_00000.xxx
ABC_00001.xxx
ABC_00002.xxx


もとより少ない桁を指定すれば、上位の桁が切り落とされます。
000.xxx
001.xxx
002.xxx
桁数を1にすると
0.xxx
1.xxx
2.xxx


このとき00から20までのファイルを1桁にすると、名前が重複するのが出てくるので、そういうのはやめてください。
上書きの確認ダイアログが出てきますよ。


JavaScript


//桁数
PadNum = 4
//拡張子
Ext = "png"

fso = WScript.CreateObject("Scripting.FileSystemObject");
shell = WScript.CreateObject("WScript.Shell");
folder = fso.GetFolder(shell.CurrentDirectory);
fc = new Enumerator(folder.files);

String.prototype.rep = function(n){ var c=this.toString(), s=""; while(--n>=0){ s+=c; }; return s; };

Pattern = "(\\D*)(\\d+)(.*)\\." + Ext;
re = new RegExp(Pattern, "i");

for (; !fc.atEnd(); fc.moveNext()){
if( fso.GetExtensionName( fc.item().name ).toLowerCase() == Ext ){
if( fc.item().name.match(re) ){
newnum = RegExp.$2;
newstr = "";
nop = false;
if( newnum.length > PadNum ){
newstr = RegExp.$1 + newnum.slice( -PadNum ) + RegExp.$3 + "." + Ext;
}else if( newnum.length < PadNum ){
newnum = "0".rep(PadNum - newnum.length) + newnum;
newstr = RegExp.$1 + newnum + RegExp.$3 + "." + Ext;
}else{
nop = true;
}

if( !nop ){
fc.item().name = newstr;
}
}
}
}

VBScript


'桁数
PadNum = 4
'拡張子
Ext = "png"

set fso = WScript.CreateObject("Scripting.FileSystemObject")
set shell = WScript.CreateObject("WScript.Shell")
set folder = fso.GetFolder(shell.CurrentDirectory)
set fc = folder.files

set regEx = new RegExp
regEx.Pattern = "(\D*)(\d+)(.*)\." & Ext
regEx.IgnoreCase = True ' 大文字と小文字を区別しないように設定します。

for each f in fc
if LCase(fso.GetExtensionName( f.name )) = Ext then
Set mat = regEx.Execute( f.name )
if mat.count > 0 then
with mat(0)
newnum = .submatches(1)
newstr = ""
nop = False
if Len( newnum ) > PadNum then
newstr = .submatches(0) & Right( newnum, PadNum ) & .submatches(2) & "." & Ext
elseif Len( newnum ) < PadNum then
newnum = String( PadNum - Len( newnum ), "0" ) & newnum
newstr = .submatches(0) & newnum & .submatches(2) & "." & Ext
else
nop = True
end if

if Not( nop ) then
f.name = newstr
end if
end with
end if
end if
next

set regEx = Nothing


どういう置換をしてるかスクリプトを見ればわかると思いますが、
数字は最初に見つけた数字しか変更しません。


桁は1以上で動くように作ってます。エラートラップしてまへん。


スクリプトと同じディレクトリにあるファイルのファイル名を変更しちゃいますよ。気をつけてください。


実は0パディングするだけのスクリプトを書くつもりだったんだけど、ちょっとしたものができちゃいました。

簡単な0パディングだと
str = "123"
これを5桁にするなら
"00000" & Right( str, 5 )
で済むんですよね。
くっつけて必要な分を切り取るって感じで。
この方法を見かけたときは目からうろこでした。
VBにはFormat関数があったのでFormat(str,"00000")で良かったんでこのRightの使い方は思いつかなかった。

今回のサンプルでは、必要な桁の分だけ"00000"を作ってくっつけてます。
JavaScriptではStringクラスにrep()メソッドを追加しています。自分自身をn回繰り返して返します。
VBScriptではString関数を使って、テキストをn回繰り返して返してます。


参考
String - MDC
JavaScript でゼロパディングするときは slice を使う - p4lifeのメモ