307 lines
12 KiB
JavaScript
307 lines
12 KiB
JavaScript
|
// This is an includefile containing the common
|
||
|
// stuff for using RoboCopy.
|
||
|
// To use, you must call RoboCopyInit().
|
||
|
// It creates the global, "g_robocopy" which contains the ActiveX object
|
||
|
// pointing to RoboCopy.
|
||
|
// When you are finished, you must call g_robocopy.UnRegister()
|
||
|
//
|
||
|
// You must have a "function [script]_js::OnEventSourceEvent(RemoteObj, DispID, cmd, params)"
|
||
|
// and filter messages to robocopy like this:
|
||
|
// if (g_robocopy == null || !g_robocopy.OnEventSource(arguments))
|
||
|
// {
|
||
|
// do your processing here...
|
||
|
// }
|
||
|
//
|
||
|
//
|
||
|
// Aside from RoboCopyInit(), all RoboCopy function may throw exceptions - you must be prepared to handle this.
|
||
|
//
|
||
|
// If you wany copy status, override the following functions:
|
||
|
// StatusStarted();
|
||
|
// StatusFile();
|
||
|
// StatusProgress(nPercent, nSize, nCopiedBytes);
|
||
|
// StatusError();
|
||
|
// StatusDone()
|
||
|
// StatusMessage(nErrorCode, strErrorMessage, strRoboCopyMessage, strFileName)
|
||
|
|
||
|
function RoboCopyInit()
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
g_robocopy = new RoboCopy();
|
||
|
}
|
||
|
catch(ex)
|
||
|
{
|
||
|
SimpleErrorDialog(LocalMachine + ": Cannot initialize RoboCopy", "RoboCopy() init failed, " + ex, false);
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
function RoboCopyUnRegister()
|
||
|
{
|
||
|
if (this.objRemote != null)
|
||
|
{
|
||
|
UnregisterEventSource(this.objRemote);
|
||
|
this.objRemote = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function RoboCopyCopyFile(srcdir, dstdir, file)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
var n = file.lastIndexOf("\\");
|
||
|
if (n != -1)
|
||
|
{
|
||
|
var filepath = file.substr(0, n + 1);
|
||
|
file = file.substr(n + 1);
|
||
|
srcdir += filepath;
|
||
|
dstdir += filepath;
|
||
|
}
|
||
|
this.nErrorCode = this.RCERR_NOT_INITIALIZED;
|
||
|
JAssert(this.objRemote != null);
|
||
|
if (this.objRemote != null)
|
||
|
{
|
||
|
LogMsg("RoboCopy file " + srcdir + file + " to " + dstdir + file);
|
||
|
this.strSrcDir = srcdir;
|
||
|
this.strDstDir = dstdir;
|
||
|
this.strSrcFile = srcdir + file;
|
||
|
this.strDstFile = dstdir + file;
|
||
|
this.objRemote.SetCopyOptions(srcdir, dstdir, file, "/ETA /R:100 /V");
|
||
|
this.objRemote.DoCopy();
|
||
|
}
|
||
|
}
|
||
|
catch(ex)
|
||
|
{
|
||
|
ex.detail = "Copyfile('" + srcdir + "', '" + dstdir + "', '" + file + "')";
|
||
|
this.TranslateException(ex);
|
||
|
}
|
||
|
return this.nErrorCode;
|
||
|
}
|
||
|
|
||
|
function RoboCopySetExcludeFiles(aFiles)
|
||
|
{
|
||
|
this.aExcludeFiles = aFiles;
|
||
|
}
|
||
|
|
||
|
function RoboCopyCopyDir(srcdir, dstdir, fRecursive)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
var options;
|
||
|
var char;
|
||
|
var i;
|
||
|
|
||
|
this.nErrorCode = this.RCERR_NOT_INITIALIZED;
|
||
|
JAssert(this.objRemote != null);
|
||
|
if (this.objRemote != null)
|
||
|
{
|
||
|
options = "/Z /ETA /R:100 /V";
|
||
|
if (fRecursive)
|
||
|
options += " /E ";
|
||
|
|
||
|
if (this.aExcludeFiles.length != 0)
|
||
|
options += " /XF ";
|
||
|
|
||
|
char = srcdir.charAt(srcdir.length - 1);
|
||
|
if (char != '\\' && char != ':')
|
||
|
srcdir += '\\';
|
||
|
|
||
|
char = dstdir.charAt(dstdir.length - 1);
|
||
|
if (char != '\\' && char != ':')
|
||
|
dstdir += '\\';
|
||
|
|
||
|
LogMsg("RoboCopy dir " + srcdir + " to " + dstdir );
|
||
|
|
||
|
this.strSrcDir = srcdir;
|
||
|
this.strDstDir = dstdir;
|
||
|
this.strSrcFile = srcdir;
|
||
|
this.strDstFile = dstdir;
|
||
|
|
||
|
if (this.aExcludeFiles.length != 0)
|
||
|
{
|
||
|
// MTRCopy.SetCopyOptions will only accept one file exclude
|
||
|
// pattern.
|
||
|
// If you call SetCopyOptions multiple times, it keeps a list
|
||
|
// of all of the file patterns to exclude.
|
||
|
for(i = 0; i < this.aExcludeFiles.length; ++i)
|
||
|
{
|
||
|
LogMsg("EXCLUDING FILE " + this.aExcludeFiles[i]);
|
||
|
this.objRemote.SetCopyOptions(srcdir, dstdir, this.aExcludeFiles[i], options);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
this.objRemote.SetCopyOptions(srcdir, dstdir, "*.*", options);
|
||
|
|
||
|
this.objRemote.DoCopy();
|
||
|
}
|
||
|
}
|
||
|
catch(ex)
|
||
|
{
|
||
|
ex.detail = "CopyDir('" + srcdir + "', '" + dstdir + "')";
|
||
|
this.TranslateException(ex);
|
||
|
}
|
||
|
return this.nErrorCode;
|
||
|
}
|
||
|
|
||
|
function RoboCopyTranslateException(ex)
|
||
|
{
|
||
|
if (!ex.number)
|
||
|
ex.number = "<undefined>";
|
||
|
|
||
|
ex.description = "Unknown RoboCopy exception: " + ex.number;
|
||
|
if ( this.ErrorMessages[ex.number] != null)
|
||
|
ex.description = this.ErrorMessages[ex.number];
|
||
|
|
||
|
throw ex;
|
||
|
}
|
||
|
|
||
|
function RoboCopyOnEventSource(objRet, aArgs)
|
||
|
{
|
||
|
var strMsg;
|
||
|
var strText;
|
||
|
|
||
|
if (aArgs[0] != this.objRemote)
|
||
|
return false;
|
||
|
|
||
|
switch(aArgs[1]) // dispid
|
||
|
{
|
||
|
case this.RC_COPYSTARTED: // ()
|
||
|
objRet.rc = this.StatusStarted(aArgs[2]);
|
||
|
break;
|
||
|
|
||
|
case this.RC_COPYFILE : // ([in] BSTR FileName)
|
||
|
this.strSrcFile = aArgs[2];
|
||
|
objRet.rc = this.StatusFile();
|
||
|
break;
|
||
|
|
||
|
case this.RC_PROGRESS : // ([in] int iPercent, [in] long lSizeLow, [in] long lSizeHigh, [in] long lCopiedLow, [in] long lCopiedHigh)
|
||
|
objRet.rc = this.StatusProgress(aArgs[2], aArgs[3], aArgs[5]);
|
||
|
break;
|
||
|
|
||
|
case this.RC_COPYERROR : // ([in] long lReason)
|
||
|
this.nErrorCode = aArgs[2];
|
||
|
|
||
|
if (this.ErrorMessages[aArgs[2]])
|
||
|
strMsg = this.ErrorMessages[aArgs[2]];
|
||
|
else
|
||
|
strMsg = 'Unknown';
|
||
|
|
||
|
objRet.rc = this.StatusError(strMsg);
|
||
|
break;
|
||
|
|
||
|
case this.RC_COPYDONE : // ()
|
||
|
objRet.rc = this.StatusDone();
|
||
|
break;
|
||
|
|
||
|
case this.RC_ERRORMESSAGE : // ([in] long lErrorCode, [in] BSTR bstrErrorText, [in] BSTR bstrMessage, [in] BSTR bstrFileName);
|
||
|
objRet.rc = this.StatusMessage(aArgs[2], aArgs[3], aArgs[4], aArgs[5]);
|
||
|
break;
|
||
|
default:
|
||
|
LogMsg("robocopy Unknown event (" + aArgs[1] + ") copying file " + this.strSrcFile + " to " + this.strDstFile);
|
||
|
objRet.rc = 0;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
function RoboStatusError(strMsg)
|
||
|
{
|
||
|
LogMsg("Robocopy copy error " + this.nErrorCode + " (" + strMsg + ") copying file " + this.strSrcFile + " to " + this.strDstFile);
|
||
|
return this.RC_CONTINUE
|
||
|
}
|
||
|
|
||
|
function RoboStatusMessage(nErrorCode, strErrorMessage, strRoboCopyMessage, strFileName)
|
||
|
{
|
||
|
LogMsg("Robocopy error message (" + nErrorCode + ") " + strErrorMessage + " " + strRoboCopyMessage + " " + strFileName);
|
||
|
return this.RC_CONTINUE
|
||
|
}
|
||
|
|
||
|
function RoboCopy()
|
||
|
{
|
||
|
if (!RoboCopy.prototype.UnRegister)
|
||
|
{
|
||
|
RoboCopy.prototype.UnRegister = RoboCopyUnRegister;
|
||
|
RoboCopy.prototype.OnEventSource = RoboCopyOnEventSource;
|
||
|
RoboCopy.prototype.CopyFile = RoboCopyCopyFile;
|
||
|
RoboCopy.prototype.TranslateException = RoboCopyTranslateException;
|
||
|
RoboCopy.prototype.CopyDir = RoboCopyCopyDir;
|
||
|
RoboCopy.prototype.SetExcludeFiles = RoboCopySetExcludeFiles;
|
||
|
|
||
|
RoboCopy.prototype.StatusStarted = function(args) { return true;}
|
||
|
RoboCopy.prototype.StatusFile = function(args) { return true;}
|
||
|
RoboCopy.prototype.StatusProgress = function(args) { return this.PROGRESS_QUIET;}
|
||
|
RoboCopy.prototype.StatusError = RoboStatusError;
|
||
|
RoboCopy.prototype.StatusDone = function(args) { return true;}
|
||
|
RoboCopy.prototype.StatusMessage = RoboStatusMessage;
|
||
|
|
||
|
// Possible Return values for the progress function
|
||
|
RoboCopy.prototype.PROGRESS_CONTINUE = 0;
|
||
|
RoboCopy.prototype.PROGRESS_CANCEL = 1;
|
||
|
RoboCopy.prototype.PROGRESS_STOP = 2;
|
||
|
RoboCopy.prototype.PROGRESS_QUIET = 3;
|
||
|
|
||
|
// Possible return values for the error function
|
||
|
RoboCopy.prototype.RC_FAIL = 0;
|
||
|
RoboCopy.prototype.RC_CONTINUE = 1;
|
||
|
|
||
|
|
||
|
RoboCopy.prototype.RC_COPYSTARTED = 1;
|
||
|
RoboCopy.prototype.RC_COPYFILE = 2;
|
||
|
RoboCopy.prototype.RC_PROGRESS = 3;
|
||
|
RoboCopy.prototype.RC_COPYERROR = 4;
|
||
|
RoboCopy.prototype.RC_COPYDONE = 5;
|
||
|
RoboCopy.prototype.RC_ERRORMESSAGE = 6;
|
||
|
|
||
|
RoboCopy.prototype.RCERR_NOT_INITIALIZED = -1
|
||
|
RoboCopy.prototype.RCERR_SRC_CANT_BE_WILDCARD = -1000
|
||
|
RoboCopy.prototype.RCERR_SRC_CANT_EXPAND = -1001
|
||
|
RoboCopy.prototype.RCERR_NO_SRC_DIR = -1002
|
||
|
RoboCopy.prototype.RCERR_DST_CANT_BE_WILDCARD = -1003
|
||
|
RoboCopy.prototype.RCERR_DST_CANT_EXPAND = -1004
|
||
|
RoboCopy.prototype.RCERR_NO_DST_DIR = -1005
|
||
|
RoboCopy.prototype.RCERR_INVALID_OPTION = -1006
|
||
|
RoboCopy.prototype.RCERR_PATH_CANT_BE_WILDCARD = -1007
|
||
|
RoboCopy.prototype.RCERR_FILESPEC_CANT_BE_PATH = -1008
|
||
|
RoboCopy.prototype.RCERR_CANT_ACCESS_SRC = -1009
|
||
|
RoboCopy.prototype.RCERR_CANT_ACCESS_DST = -1010
|
||
|
RoboCopy.prototype.RCERR_CANT_CREATE_DST_DIR = -1011
|
||
|
RoboCopy.prototype.RCERR_CANT_GET_MODULE_HANDLE = -1012
|
||
|
RoboCopy.prototype.RCERR_OPTIONS_NOT_SET = -1013
|
||
|
RoboCopy.prototype.RCERR_RETRY_LIMIT = -1014 // Fatal - no more retries
|
||
|
RoboCopy.prototype.RCERR_WAITING_FOR_RETRY = -1015 // NON-Fatal - information
|
||
|
RoboCopy.prototype.RCERR_RETRYING = -1016 // NON-Fatal - information
|
||
|
|
||
|
RoboCopy.prototype.ErrorMessages = new Object();
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_NOT_INITIALIZED] = "RoboCopy Error: NOT_INITIALIZED";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_SRC_CANT_BE_WILDCARD] = "RoboCopy Error: SRC_CANT_BE_WILDCARD";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_SRC_CANT_EXPAND] = "RoboCopy Error: SRC_CANT_EXPAND";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_NO_SRC_DIR] = "RoboCopy Error: NO_SRC_DIR";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_DST_CANT_BE_WILDCARD] = "RoboCopy Error: DST_CANT_BE_WILDCARD";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_DST_CANT_EXPAND] = "RoboCopy Error: DST_CANT_EXPAND";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_NO_DST_DIR] = "RoboCopy Error: NO_DST_DIR";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_INVALID_OPTION] = "RoboCopy Error: INVALID_OPTION";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_PATH_CANT_BE_WILDCARD] = "RoboCopy Error: PATH_CANT_BE_WILDCARD";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_FILESPEC_CANT_BE_PATH] = "RoboCopy Error: FILESPEC_CANT_BE_PATH";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_CANT_ACCESS_SRC] = "RoboCopy Error: CANT_ACCESS_SRC";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_CANT_ACCESS_DST] = "RoboCopy Error: CANT_ACCESS_DST";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_CANT_CREATE_DST_DIR] = "RoboCopy Error: CANT_CREATE_DST_DIR";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_CANT_GET_MODULE_HANDLE] = "RoboCopy Error: CANT_GET_MODULE_HANDLE";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_OPTIONS_NOT_SET] = "RoboCopy Error: OPTIONS_NOT_SET";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_RETRY_LIMIT] = "RoboCopy Error: RETRY_LIMIT";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_WAITING_FOR_RETRY] = "RoboCopy: WAITING_FOR_RETRY";
|
||
|
RoboCopy.prototype.ErrorMessages[this.RCERR_RETRYING] = "RoboCopy: RETRYING";
|
||
|
}
|
||
|
this.objRemote = new ActiveXObject('MTScript.RoboCopy');
|
||
|
|
||
|
this.nErrorCode = 0;
|
||
|
this.strSrcDir = '';
|
||
|
this.strDstDir = '';
|
||
|
this.strSrcFile = "<notset>";
|
||
|
this.strDstFile = "<notset>";
|
||
|
this.aExcludeFiles = new Array();
|
||
|
RegisterEventSource(this.objRemote, "MTScript.RoboCopyEvents");
|
||
|
}
|