|
更新日時が新しいファイルだけをコピーするという機能は、たびたび話があるのです
が、秀丸ファイラー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;
}
|
|