*[PPx]スクリプトメモ FastCopy

//!*script
// FastCopyを使った削除/複写/移動/同期ルーチン Ver 4.4
// 同一ドライブ間での移動は*ppcfileを使用する
// 引数1:fastcopyの/cmd
// 引数2:fastcopyの/force_start
// 使用エイリアス:FastCopy
// ============================================================
//^変数宣言
var arg1      = '';    // 引数:/cmd
var arg2      = '';    // 引数:/force_start
var FList     = '';    // PPxレスポンスファイル名
var iDir      = '';    // 入力元ディレクトリ
var oDir      = '';    // 出力先ディレクトリ
var title     = '';    // ウインドウタイトル
var command   = '';    // PPxコマンドワーク
var RetCD     = '';    // 戻り値
var WSHObj    = '';    //wshシェル

//スクリプト常駐指定
//PPx.StayMode = 0;    //0:常駐解除
//PPx.StayMode = 1;    //1:ファイルのみ常駐。現在は2:リソースも常駐すると同等ためコメントアウト

// 相対ディレクトリ表示のみは速攻抜け
if (PPx.EntryMarkCount == 0   ) {
    if (  (PPx.Extract('%C')  == '..')
       || (PPx.Extract('%C')  == '.')  ) {
       PPx.Quit();
    }
}

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

//引数取得
arg1 = PPx.Arguments.Item(0);  //0オリジン
arg2 = ' ' + PPx.Arguments.Item(1);

// サブルーチン:パスが深い場合への暫定対処。
//              ファイル名のみでレスポンスファイルを作成し
//              自前でパスを付与、BOM除去出力する。
function Func_ResFConv(iDir) {
   var iLine = '';
   var FList = PPx.Extract('%a*8FCN');
   PPx.Execute('%K \"@^END\"');
   var StreamObjI = new ActiveXObject('ADODB.Stream');
   var StreamObjO = new ActiveXObject('ADODB.Stream');
   StreamObjI.Type = 2;
   StreamObjO.Type = 2;
   StreamObjI.CharSet = 'utf-8';
   StreamObjO.CharSet = 'utf-8';
   StreamObjI.Open();
   StreamObjO.Open();
   StreamObjI.LoadFromFile(FList);
   while (!StreamObjI.EOS) {
      iLine = StreamObjI.readText(-2);
      iLine = iDir + iLine;
      StreamObjO.WriteText(iLine,1);
   }
   StreamObjI.Close();
   StreamObjO.SaveToFile(FList,2);
   StreamObjO.Close();
   StreamObjI.Type = 1;
   StreamObjO.Type = 1;
   StreamObjI.Open();
   StreamObjO.Open();
   StreamObjI.LoadFromFile(FList);
   StreamObjI.Position = 3;
   StreamObjO.Write(StreamObjI.Read());
   StreamObjI.Close();
   StreamObjO.SaveToFile(FList,2);
   StreamObjO.Close();
   StreamObjI = '';
   StreamObjO = '';
   PPx.Execute('%K"@^END"');  // マークを外す
   return FList;
}

//呼出モード判定
WSHObj = new ActiveXObject('WScript.Shell');
switch (arg1.toLowerCase()){
   case 'delete':   // deleteだけ他とは別扱い
        command = '%\"削除確認\"'
        if (PPx.EntryMarkCount < 2) {
            command = command + '%Q\"' + PPx.Extract('%C') + 'を削除しますか?\"';
        } else {
            command = command + '%Q\"全' + PPx.EntryMarkCount + 'ファイルを削除しますか?\"';
        }
        RetCD = PPx.Execute(command);
        if ( RetCD != 0) {
             PPx.Quit();
        }
        FList = Func_ResFConv(iDir);
        command = PPx.Extract('%\'FastCopy\'')
                + ' /cmd=delete'
                + ' /force_close'
                + ' /error_stop'
                + arg2
                + ' /no_confirm_del'
                + ' /wipe_del=FALSE'
//                + ' /log=FALSE'
                + ' /logfile=' + WSHObj.ExpandEnvironmentStrings('\"%Temp%\\fastcopy.log\"')
                + ' /utf8'
                + ' /srcfile=\"' + FList + '\"';
        WSHObj.run(command,0,true);
        PPx.Quit();
        break;
   case 'diff':
   case 'noexist_only':
   case 'update':
   case 'force_copy':
        title = '複写先パス';
        break;
   case 'move':
        title = '移動先パス';
        break;
   case 'sync':
        title = '同期先パス';
        break;
   default:
        PPx.Echo('処理モード指定エラー。中断します。')
        PPx.Quit();
        break;
}

// 出力ディレクトリ確定
command = '%\"' + title + '\"%ed%$2%\\';
oDir    = PPx.Extract(command);
if (oDir == '') {  //ESC押下チェック
   PPx.Quit();
}

// 同一ドライブ間移動チェック
if (arg1.toLowerCase() == 'move') {
    if (    oDir.replace(/^([^\\]+|\\\\[^\\]+).*/,'$1')
        ==  iDir.replace(/^([^\\]+|\\\\[^\\]+).*/,'$1') ) {
        command = '*ppcfile !move,"'
                + oDir.replace(/%/g,'%%')
                + '",'
                + '/qstart '
                + '/nocount '
//                + '/min '
                + '/same:2 '      // 上書き
                + '/sameall:on';  // 確認なし
        PPx.Execute(command);
        PPx.Quit();
    }
}

// 入力ファイル確定
FList = Func_ResFConv(iDir);
command = PPx.Extract('%\'FastCopy\'')
        + ' /cmd=' + arg1
        + ' /force_close'                        //エラーが発生していた場合も強制的に終了
        + arg2                                   ///force_start
        + ' /estimate'                           //コピー完了時間予測
        + ' /error_stop'                         //エラー発生時にダイアログを出力
//        + ' /disk_mode=diff'                     //別HDDモード
        + ' /disk_mode=auto'                     //自動判定
//        + ' /log=FALSE'
        + ' /logfile=' + WSHObj.ExpandEnvironmentStrings('\"%Temp%\\fastcopy.log\"')
        + ' /utf8'                               //ログ出力UTF-8
        + ' /exclude=\"$Recycle.Bin\\;RECYCLER\\;System Volume Information\\;VSNAP.IDX;Thumbs.db;desktop.ini"'
        + ' /reparse'                            //ジャンクション・マウントポイント・シンボリックリンクをコピー
        + ' /acl=FALSE'                          //アクセスコントロールリストをコピーしない
        + ' /stream=FALSE'                       //副次ストリームをコピーしない
        + ' /verify'                             //MD5によるベリファイ
        + ' /skip_empty_dir=FALSE'               //空ディレクトリもコピーする
        + ' /srcfile=\"' + FList + '\"'
        + ' /to=\"' + oDir +'\"';
WSHObj.run(command,0,false);  //0:ウィンドウ非表示 false:終了待機しない

// 後処理
WSHObj = '';
PPx.Quit();