*[PPx]スクリプトメモ RAR書庫内ファイルCRCリスト作成

実際に何に使うのか?と問われるとちょっと答えに詰まる
RAR書庫に格納されたファイルのCRC値を一覧出力するスクリプト
HashCheck Shell Extensionで使えるように整形したsfvファイルを作成する。

空気読んで解凍モドキを作成したときに思いつきでパパッと書いたもの。
RAR5のBLAKE2には面倒なので対応していない。

//!*script
// RAR書庫内ファイルのハッシュリスト(CRC32)出力
// 使用バッチ    :CRCListRAR.bat
// 使用プログラム:rar.exe ※バッチ中で使用
// ============================================================
//^変数宣言
var HashList = [];    // ハッシュリスト(CRC32)
var i        = 0;    // 配列インデックス
var MaxLoop  = '';    // 配列要素数
var command  = '';    // PPxコマンドワーク
var RetCD    = '';    // 戻り値
var RFile    = '';    // チェック対象ファイル名
var HFile    = '';    // 作成するハッシュリストファイル名(拡張子なし)
var iDir     = '';    // 入力ファイルディレクトリ
var FListO   = '';    // レスポンスファイル名(処理結果用)
var FListL   = '';    // レスポンスファイル名(ログ用)
var StmObjO  = '';    // ストリームオブジェクト(処理結果用)
var StmObjL  = '';    // ストリームオブジェクト(ログ用)
var iLineO   = '';    // ストリーム入力データワーク
var iLineL   = '';    // ストリーム入力データワーク
var WSHObj   = '';    // wshシェル

// カーソル位置ファイル拡張子判定 RAR以外は即時終了
if ((PPx.Extract('%t')).toLowerCase() != 'rar') {
    PPx.Quit();
}

// カーソル位置ファイル名(拡張子なし)取得
RFile = PPx.Extract('%Y');

//分割書庫チェック
if (!RFile.match(/\.part[0-9]*[0-9]$/)) {
    HFile = RFile;
    RFile = RFile + '.rar';
} else {
    //分割書庫の場合
    HFile = RFile.replace(/\.part[0-9]*$/,'');    // part部を削除
    RFile = HFile + '.Part*.rar';                 // part*付加
}

// 入力ディレクトリ確定
iDir = PPx.Extract('%FDN%\\');

// 念のためマークを外す
PPx.Execute('%K"@^END"');
// ワーク用レスポンスファイル作成
FListO = PPx.Extract('%a*8FCN');
FListL = PPx.Extract('%a*8FCN');
//DBG用 ラストの削除を忘れずに**************
//FListO = 't:\\rarout.txt';
//FListL = 't:\\rarlog.txt';
//******************************************
// レスポンスファイル削除
PPx.Execute('*delete "' + FListO + '"');
PPx.Execute('*delete "' + FListL + '"');

// 書庫内リスト作成
command = '"' + PPx.Extract('%0%\\') + 'script\\CRCListRAR.bat"'
        + ' "' + iDir + '"'      // 入力ディレクトリ
        + ' "' + FListL + '"'    // rar.exeログファイル
        + ' "' + RFile + '"'     // チェック対象ファイル名
        + ' "' + FListO + '"';   // rar.exeリストファイル
WSHObj  = new ActiveXObject('WScript.Shell');
RetCD   = WSHObj.run(command,0,true);
WSHObj  = '';

// ハッシュリスト作成
StmObjO         = new ActiveXObject('ADODB.Stream');
StmObjO.type    = 2;
StmObjO.charset = 'SJIS';
StmObjO.Open();
StmObjL         = new ActiveXObject('ADODB.Stream');
StmObjL.type    = 2;
StmObjL.charset = 'utf-16';
StmObjL.Open();

StmObjO.loadFromFile(FListO);
StmObjL.loadFromFile(FListL);
// ループ処理 出力テキストを配列に保存
while (!StmObjO.EOS) {
    iLineO = StmObjO.readText(-2);
    iLineL = StmObjL.readText(-2);
    iLineO = iLineO.replace(/ +/g,' '); // 連続した空白を一つにする(なぜか\sだとうまくいかない)
    iLineO = iLineO.split(" ");         // 4:rate 7:CRC32

    if ( (!iLineO[1].match(/^.{3}D/))   // ディレクトリチェック
      && (iLineO[4] != '<->')           // 継続データチェック1
      && (iLineO[4] != '-->')           // 継続データチェック2
      && (iLineO[4] != '<->')           // 継続データチェック3
      && (iLineO[4] != 'ボリューム')    // ボリュームチェック1(日本語版)
      && (iLineO[4] != 'volume') ) {    // ボリュームチェック2(英語版)
        HashList.push(iLineL + ' ' + iLineO[7]);
    }
}
StmObjO.Close();
StmObjL.Close();
StmObjO = '';
StmObjL = '';

// ループ処理 ハッシュリスト出力
MaxLoop = HashList.length;            // 配列要素数保存
StmObjO = new ActiveXObject('ADODB.Stream');
StmObjO.Type = 2;
StmObjO.CharSet = 'utf-8';
StmObjO.Open();
for (i=0; i < MaxLoop; i++) {
    StmObjO.WriteText(HashList[i],1);    // 0:改行なし 1:改行あり
}
StmObjO.SaveToFile(iDir + HFile + '.sfv',2);    // 1:新規作成(あるとエラー) 2:ある場合は上書き
StmObjO.Close();
StmObjO = '';

// レスポンスファイル削除
PPx.Execute('*delete "' + FListO + '"');
PPx.Execute('*delete "' + FListL + '"');
// 終了
PPx.Quit();

CRCListRAR.bat

@rem RAR書庫のリスト取得
@rem %1:対象書庫のパス %2:RAR.exeログファイル %3:対象書庫名 %4:RAR.exe出力リストファイル
@rem 行の継続は先頭スペースが無難
@rem findstrの正規表現は繰り返し回数の指定ができない
@rem chcpを指定してもrar.exeがANSIで出力してしまう
@echo off
rem chcp 65001
SET PATH=C:\Program Files\WinRAR;%PATH%
cd /d %1
Rar.exe v -p- -logFU=%2 %3^
 | findstr /r /c:"  [0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]  "^
 > %4