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

もともとは私家版の「エディタを使って一括リネーム」から
連番リネーム部分を切り出したサブセットだったのだが・・・。
テスト中に拡張子判定をPPxの設定に合わせて厳密にやる必要が
あることに気づき、いつの間にか全面書き換えしていたという。(笑)

ディレクトリにも拡張子を持たせる
・ファイル名中にピリオドは絶対含めない
・拡張子のないファイルは認めない
・絶対にファイル名を重複させない自信がある
人には冗長なだけのスクリプト

//!*script
// カレントディレクトリ中の全ファイル(ディレクトリ除く)を
// 000からの連番(3桁)リネーム Ver2.0
// ============================================================

//^変数宣言
var OldFile  = [];    // リネーム前ファイル名格納配列
var OldExt   = [];    // リネーム前ファイル拡張子格納配列
var i        = 0;     // 配列インデックス
var iDir     = '';    // 入力ファイルディレクトリ
var OldName  = '';    // リネーム前ファイル名ワーク
var NewName  = '';    // リネーム後ファイル名ワーク
var FListX   = '';    // PPxレスポンスファイル名(ファイル名)
var FListT   = '';    // PPxレスポンスファイル名(拡張子)
var MaxLoop  = '';    // PPxマークエントリ数
var command  = '';    // PPxコマンドワーク
var StmObjX  = '';    // ストリームオブジェクト(ファイル名)
var StmObjT  = '';    // ストリームオブジェクト(拡張子)
var prefix   = '';    // 接頭辞入力ワーク
var nowdate  = '';    // 日付オブジェクトワーク

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

// 接頭辞問い合わせ ※予約語:DATE入力時は当日日付に置き換え
    prefix = PPx.Extract('%"prefix"%ex%E');
    if (prefix == 'DATE') {
        nowdate = new Date();
        prefix  = nowdate.getFullYear()
                + ('0' + (nowdate.getMonth()+1)).replace(/.?(..$)/,'$1')
                + ('0' + nowdate.getDate()).replace(/.?(..$)/,'$1')
                + '_';
        nowdate = '';
    }

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

// マスク解除
PPx.Execute('*maskentry');

// 名前順ソート
PPx.Execute('*sortentry &N\t名前順');

// マーク
PPx.Execute('%K"@HOME"');     // ファイルのみマーク
//PPx.Execute('%K"@END"');    // 全エントリマーク
if (PPx.EntryMarkCount == 0) {  // マーク数チェック
	PPx.Echo('対象ファイルがありません。')
    PPx.Quit(-1);
};

// レスポンスファイル作成
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 = '';

MaxLoop = OldFile.length;  // マーク数保存
PPx.Execute('%K"@^END"');  // マークを外す

// ループ処理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 = ('00' + i).replace(/^.*(\d{3})$/,'$1.')    // プリフィックス 3桁連番
          + OldName;
  OldFile[i] = NewName;
  command = '*rename "'
          + iDir + OldName
          + '","'
          + iDir + NewName
          + '"';
  if (PPx.Execute(command) != 0) {  // リネームコマンド発行
      PPx.Quit(-1);                 // エラー時中断
  }
}

// 連番振り直し
for (i=0; i < MaxLoop; i++) {
  NewName = prefix
          + ('00' + i).replace(/^.*(\d{3})$/,'$1');   // 3桁連番
  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();