新しいファイルのみコピーNo.08656
stone0256 さん 20/06/22 06:48
 
fileVisorを使ってきましたが、昨日から秀丸filerを試しています。

ファイルコピーで、送付先と名称が重なるとき、更新時間の新しいものだけ重ね書き
する機能はないんでしょうか?


[ ]
RE:08656 新しいファイルのみコピーNo.08657
秀丸担当 さん 20/06/22 12:26
 

更新日時が新しいファイルだけをコピーするという機能は、たびたび話があるのです
が、秀丸ファイラーClassicの機能としては無いです。すみません。
Robocopyを使ったスクリプトの方法を一時やろうとしたのですが、十分ではない点が
あって会議室に書いただけになっていたスクリプトがあります。
スクリプトは、ブックマーク登録して、ツールバーのボタンやキー割り当てができま
す。
以前に書いたもので、過去ログに行ってしまうかもしれないので末尾に改めて書いて
おきます。

関連スレッド:
https://www.maruo.co.jp/turukame/7/x08359_.html#8359

十分でないというのは、ファイル一覧上の大量のファイルをクリップボードにコピー
したときのことで、フォルダ単体(あるいは数十個くらい)のクリップボードへのコ
ピーであれば、フォルダ内のファイルが大量にあっても問題は無いです。
なので、全く使えないわけではないので、いまさらではありますが、ライブラリにも
アップしておこうかと思います。
このスクリプトと同等のGUI(ウィンドウ上で操作する感じ)の機能もあったらいい
と思います。


以下がスクリプト(テキストエディタで例えばC:\Folder\Robocopy.jsとして保存)
-------


var strOption = "/XO"; //新しいファイルだけをコピー
//--------------
strWScriptType = typeof( WScript );
if( strWScriptType.toLowerCase() == "object" ) {
  strMsg =
    "このスクリプトは秀丸ファイラーClassic専用です。\n" +
    "\n" +
    "「ブックマークの整理」または「ツールの整理」で「追加」して、" +
    "パスの右側の「>>」ボタンの「スクリプトの参照」より、このファ" +
    "イルを指定します。\n" +
    "(パスの先頭に「script:」と書かれたパスとして登録)"
  WScript.Echo( strMsg );
  WScript.Quit();
}

if(Version<103011){
  Message("このスクリプトの実行には秀丸ファイラーClassic V1.03β11以降が"
         +"必要です。");
  EndMacro();
}
var varVbArray = GetClipboardFiles();
var objArray = varVbArray.toArray();
var cFiles = objArray.length;
if( cFiles == 0 ) {
  Message("クリップボードにファイルがありません。");
  EndMacro();
}
//内容確認 Message( objArray.join("\n") );
var strOptionDesc = "";
if( strOption == "/XO" ) {
  strOptionDesc = "(新しいファイルだけをコピー)";
}
if( strOption != "" ) strOption = " " + strOption;
var objFso = new ActiveXObject("Scripting.FileSystemObject");
var strSrcDir = objFso.GetParentFolderName(objArray[0]);
var strDestDir = GetDirectory();
if( strSrcDir.toLowerCase() == strDestDir.toLowerCase() ) {
    Message("コピー元とコピー先のフォルダが同じです。");
    EndMacro();
}

if( Question(""
  + "「Robocopyで貼り付け」\n"
  + "新しいファイルだけをコピーします。\n"
  + "\n"
  + "-----------------------------------------------\n"
  + " コピー元:" + strSrcDir + "\n"
  + " コピー先:" + strDestDir + "\n"
  + " 対象:" + cFiles + " 個のファイルまたはフォルダ\n"
  + "-----------------------------------------------\n"
  + "\n"
  + "よろしいですか?\n"
  ) == 0
 ) {
  EndMacro();
}

var strParams = "/c ";
var cProcessed = 0;
var strNoDirFiles = "";
var i =0;
for( i = 0; i < cFiles; i ++ ) {
  var strOneFull = objArray[i];
  var strOneBase = objFso.GetFileName(strOneFull);
  if( objFso.GetParentFolderName(strOneFull).toLowerCase()
   != strSrcDir.toLowerCase() ) {
    Message("コピー元が1つのフォルダ配下ではありません。");
    EndMacro();
  }
  if( objFso.FolderExists(strOneFull) ) {
    if( cProcessed > 0 ) strParams += " & ";
    strDestDirSub = objFso.BuildPath(strDestDir,strOneBase);
    //strParams += "md " + AutoQuote(strDestDirSub);
    //strParams += " & ";
    strParams += "robocopy.exe"
      + " " + AutoQuote(strOneFull)
      + " " + AutoQuote(strDestDirSub)
      + " /E" + strOption;
    cProcessed ++;
  } else {
    strNoDirFiles += " " + AutoQuote(strOneBase);
  }
}
if( strNoDirFiles != "" ) {
  // /E /S 禁止
  if( cProcessed > 0 ) strParams += " & ";
  strParams += "robocopy.exe"
    + " " + AutoQuote(strSrcDir)
    + " " + AutoQuote(strDestDir)
    + strNoDirFiles
    + strOption;
  cProcessed ++;
}
if(cProcessed > 0 ) {
  strParams += " & pause";
}
if(strParams.length>=8000){
  Message("項目が多すぎます。");
  EndMacro();
}

//8190文字くらいでNG
var objShell = new ActiveXObject( "WScript.Shell" );
objShell.Run( "cmd.exe "+strParams, 1, 0 );
EndMacro();

function AutoQuote( str ) {
    if( str.indexOf(" ")>=0){
      return "\""+str+"\"";
    }
    if( str.indexOf("&")>=0){
      return "\""+str+"\"";
    }
    return str;
}

[ ]
RE:08657 新しいファイルのみコピーNo.08662
stone0256 さん 20/06/24 18:58
 
コメントありがとうございます。
ただ、アプリのユーザーとしてはよくわかりません。
今後とも、更新ファイルのみ「上書きする」機能を多用するので、FileVisor, 秀丸
ファイラーの併用を試みることとします。

[ ]