*[PPx]スクリプトメモ ファイル名の一括連番リネーム

使っているうちにいろいろと手を入れ続けていて
以前とはだいぶかわってしまった。
最初に入力する初期値から連番の桁数を決定するので
・1入力 1,2,3…10,11,12…99,100,101…
・01入力 01,02,03…10,11,12…99,100,101…
・001入力 001,002,003…010,011,012…099,100,101…
となる。

//!*script
// 連番リネーム Ver4.1
// ============================================================

//^変数宣言
var OldFile  = [];    // リネーム前ファイル名格納配列
var OldExt   = [];    // リネーム前ファイル拡張子格納配列
var i        = 0;     // 配列インデックス
var iDir     = '';    // 入力ファイルディレクトリ
var OldName  = '';    // リネーム前ファイル名ワーク
var NewName  = '';    // リネーム後ファイル名ワーク
var FListX   = '';    // PPxレスポンスファイル名(ファイル名)
var FListT   = '';    // PPxレスポンスファイル名(拡張子)
var MaxLoop  = '';    // PPxマークエントリ数
var LoopDgit = 0;     // PPxマークエントリ数桁数
var command  = '';    // PPxコマンドワーク
var StmObjX  = '';    // ストリームオブジェクト(ファイル名)
var StmObjT  = '';    // ストリームオブジェクト(拡張子)
var DummyPre = '';    // 接頭辞ワーク
var RegObj   = '';    // 正規表現オブジェクト
var NumOrgn  = '';    // 連番開始位置
var NumDgit  = 0;     // 連番桁数

// 確認メッセージ
command = '%"' + (PPx.ScriptName).replace(/^.+\\(.+$)/,'$1') + '"'
        + '%:%QN"全ファイルを連番リネームしますか?"';
if (PPx.Execute(command) != 0) {
    PPx.Quit();
}

//開始位置/桁数問い合わせ ※デフォルトは'000'
NumOrgn = PPx.Extract('%"開始位置/桁数"%{000%}');
if (NumOrgn == '') {  //ESC押下チェック
   PPx.Quit();
}

//数値チェック ※エラー時中断
if (NumOrgn.match(/[^0-9]+/)) {
    command = '%"' + (PPx.ScriptName).replace(/^.+\\(.+$)/,'$1') + '"'
            + '%:%I"数値以外が入力されました"';
    PPx.Execute(command);
    PPx.Quit(-1);
}

//開始位置を数値変換
NumDgit = NumOrgn.length;
NumOrgn = Number(NumOrgn);

// 入力ディレクトリ確定
iDir = PPx.Extract('%FDN%\\');
iDir = iDir.replace(/%/g,'%%');  // ディレクトリ名に%が含まれている場合の対処

if (PPx.EntryMarkCount == 0) {   // マーク数チェック
	PPx.Execute('%K"@HOME"');    // ファイルのみマーク
//	PPx.Execute('%K"@END"');     // 全エントリマーク
};

// レスポンスファイル作成
FListX = PPx.Extract('%a*8FXN');  // ファイル名のみ
FListT = PPx.Extract('%a*8FTN');  // 拡張子

// streem設定
StmObjX = new ActiveXObject('ADODB.Stream');
StmObjT = new ActiveXObject('ADODB.Stream');
StmObjX.type = 2;
StmObjT.type = 2;
StmObjX.charset = 'utf-8';
StmObjT.charset = 'utf-8';
StmObjX.Open();
StmObjT.Open();
StmObjX.loadFromFile(FListX);
StmObjT.loadFromFile(FListT);

// 配列に格納
while (!StmObjX.EOS) {
   OldFile.push(StmObjX.ReadText('-2'));
   OldExt.push(StmObjT.ReadText('-2'));
}

// ストリームクローズ
StmObjX.Close();
StmObjT.Close();
StmObjX = '';
StmObjT = '';
PPx.Execute('*delete "' + FListX + '"');
PPx.Execute('*delete "' + FListT + '"');


MaxLoop = OldFile.length;			// マーク数保存
LooDgit = String(MaxLoop).length;	// マーク数桁数 ※型変換が必要
PPx.Execute('%K"@^END"');  // マークを外す

//ダミーPrefix生成  ※PadLeftが使えない
DummyPre = '';
for (i=0; i < LooDgit; i++) {
	DummyPre = DummyPre + '0';		// 桁数分0を連結
}

//正規表現オブジェクト生成 ※マーク数桁数
RegObj = new RegExp('^.*(\\d{' + LooDgit + '}$)');  //\dは\\d

// ループ処理1 一旦プリフィックスを付けてリネーム
for (i=0; i < MaxLoop; i++) {
  OldName = (OldFile[i]).replace(/%/g,'%%');          // ファイル名に%が含まれている場合の対処
  if (OldExt[i] != '') {
      OldExt[i]  = (OldExt[i]).replace(/%/g,'%%');    // 拡張子に%が含まれている場合の対処
      OldName    =  OldName + '.' + OldExt[i];
  }

  NewName = (DummyPre + i).replace(RegObj,'$1.')
          + OldName;
  OldFile[i] = NewName;
  command = '*rename "'
          + iDir + OldName
          + '","'
          + iDir + NewName
          + '"';
  if (PPx.Execute(command) != 0) {  // リネームコマンド発行
      PPx.Quit(-1);                 // エラー時中断
  }
}

//ダミーPrefix生成  ※PadLeftが使えない
DummyPre = '';
for (i=0; i < NumDgit; i++) {
	DummyPre = DummyPre + '0';		// 桁数分0を連結
}

//正規表現オブジェクト生成 ※指定桁数
RegObj = new RegExp('^.*(\\d{' + NumDgit + '}$)');  //\dは\\d

// 連番振り直し
for (i=0; i < MaxLoop; i++) {
	if ( (String(NumOrgn + i)).length < NumDgit ) {
		NewName = (DummyPre + (NumOrgn + i) ).replace(RegObj,'$1');
	} else {
		NewName = NumOrgn + i;
	}

	if (OldExt[i] != '') {
		NewName  = NewName + '.' + OldExt[i];
	}

	command = '*rename "'
			+ iDir + OldFile[i]
			+ '","'
			+ iDir + NewName + '"';
	if (PPx.Execute(command) != 0) {  // リネームコマンド発行
		PPx.Quit(-1);                 // エラー時中断
	}
}

//再読込
PPx.Execute('%K "@F5"');
PPx.Quit();