// 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 = ""; 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 = ""; this.strDstFile = ""; this.aExcludeFiles = new Array(); RegisterEventSource(this.objRemote, "MTScript.RoboCopyEvents"); }