PascalScript en Syncovery
Syncovery incluye un motor PascalScript, que le permite personalizar el comportamiento de su perfil de muchas maneras. PascalScript se añadió en Syncovery 8, y desde la primera versión se han añadido muchos hooks y funciones nuevos. Para cambiar un comportamiento concreto, debe escribir una función hook y programar algo de código. En la mayoría de los casos, nuestro soporte técnico escribirá el código por usted. Para scripts más grandes o complicados, considere una Suscripción de soporte Premium que incluya desarrollo de scripts personalizados. El script se especifica en el perfil mediante la casilla “Pascal Script…” de la pestaña de la categoría de configuración del trabajo. Los PascalScripts tienen acceso a toda la configuración del perfil y pueden leerla y modificarla mediante las funciones de utilidad GetProfileProperty y SetProfileProperty.
Scripts útiles listos para usar
Los siguientes scripts pueden usarse tal cual; simplemente pegue el script en el cuadro de diálogo de PascalScript.
- Acortar rutas largas
Este script acorta los nombres de archivo si la ruta total supera los 250 caracteres. Añade un hash CRC32 basado en el nombre de archivo original para garantizar que los nombres acortados sean únicos. Los nombres de las carpetas no se modifican. Los nombres acortados se utilizan solo al copiar del lado izquierdo al lado derecho. El lado izquierdo permanece intacto. - Acortar nombres de archivo largos
Este script acorta los nombres de archivo que tienen más de 114 caracteres, añadiendo un hash CRC32 basado en el nombre original del archivo para garantizar que los nombres acortados sean únicos. Al igual que el script anterior, los nombres de las carpetas no se modifican, y los nombres acortados solo afectan a la parte derecha. - Convertir caracteres no permitidos para Windows
Este script le permite tener los caracteres no permitidos /:\?|<>“* en los nombres de archivo del lado izquierdo. El lado derecho puede ser un almacenamiento compatible con Windows, como una unidad NTFS local. - Notificaciones simples por correo electrónico
Este script simplifica las notificaciones por correo electrónico y puede editarse fácilmente para personalizar tus correos electrónicos. - Enviar notificaciones por correo electrónico según los resultados del perfil
Este script hace que las notificaciones por correo electrónico solo se envíen si se copiaron menos de 10 o más de 100 archivos de izquierda a derecha. - Vincular una conexión FTP a un puerto LAN específico
Este script le permite especificar qué puerto LAN usar para una conexión FTP. Tenga en cuenta que esto solo funciona con la biblioteca FTP 3 (en Windows) o 2 (en otras plataformas). - Eliminar archivos de más de 30 días del lado origen (izquierdo)
Este script hará que Syncovery elimine los archivos antiguos del lado origen de una sincronización unidireccional. El lado origen debe ser el lado izquierdo. El lado derecho servirá como archivo histórico, donde se conservan todos los archivos históricos, mientras que el lado izquierdo solo contiene los archivos de los últimos 30 días. Se supone que los archivos nuevos aparecen solo en el lado izquierdo. El perfil debe usarse únicamente con el modo de operación “Copiado estándar”. El número de días puede ajustarse en el script. También puede elegir si desea eliminar los archivos recién copiados (poco probable, porque seguramente no tendrán más de 30 días) y/o los archivos que ya existen en ambos lados cuando se ejecuta el trabajo (el caso más probable).
Ganchos de PascalScript disponibles
Actualmente están disponibles los siguientes ganchos. Se añadirán más según sea necesario para satisfacer las solicitudes de los clientes.
- OnActionComplete
- OnAfterFileCopy
- OnBeforeFileCopy
- OnBeforeFileUpload
- OnBeforeFolderCreate
- OnBeforeMainActionPhase
- OnCanRunProfile
- OnCloudConnect
- OnCloudDisconnect
- OnDownloadComplete
- OnFileCopy
- OnGetCustomHeaders
- OnGetNextRunTime
- OnGetProfilePathBeforeListing
- OnGetProfilePathBeforeCopying
- OnHttpPost
- OnIncludeItem
- OnLogFileClosed
- OnMoveFileToDeletedFolder
- OnNeedToReRun
- OnNoActionItem
- OnNormalizeFilename
- OnProfileStart
- OnProfileResults
- OnProgress
- OnReplaceFilenameLeftToRight
- OnReplaceFilenameRightToLeft
- OnScanFolder
- OnSendEmail
- OnSkipOrIgnoreItem
- OnUploadComplete
- OnVerifySSHServerFingerprint
- OnVerifyTLSCertificate
- OnVolumeShadowComplete
Funciones de PascalScript disponibles
Tiene disponibles las siguientes funciones para llamar.
- funciones estándar como Pos, Copy, Length, Ord
- function GetProfileProperty(const fieldname:UnicodeString):UnicodeString;
- function SetProfileProperty(const fieldname:UnicodeString;const val:UnicodeString):Boolean;(estas funciones usan los mismos nombres de campo que el formato XML y la línea de comandos. Consulte el diccionario de ajustes al final de la página de línea de comandos de Syncovery)
- function SaveProfileSettings:Boolean;
- procedure LoadFolderPriorityTextFile(const s:UnicodeString);
- function ConcatPath(const a,b:UnicodeString; const t: Int64):UnicodeString;
- function ConcatPathWithDelim(const a,b,delim:UnicodeString):UnicodeString;
- function ExtractFileName(const s: UnicodeString):UnicodeString;
- function ExtractFileNameFTP(const s: UnicodeString):UnicodeString;
- function ExtractFilePath(const s: UnicodeString):UnicodeString;
- function ExtractFilePathFTP(const s: UnicodeString):UnicodeString;
- function ExtractURLPartAfterServer(const s: UnicodeString):UnicodeString;
- function ExtractFileExt(const s: UnicodeString):UnicodeString;
- function ChangeFileExt(const s,t: UnicodeString):UnicodeString;
- function FileExists(const FileName: UnicodeString):Boolean;
- function FileExistsMatching(const FileName: UnicodeString):Boolean;
- function EntryExists(const FileName: UnicodeString):Boolean;
- function FileAge(const FileName: UnicodeString):Double;
- function FileCopy(const ASource,ADest:UnicodeString):Int64;
- function FileDelete(const AFile:UnicodeString):Int64;
- function FileRename(const ASource,ADest:UnicodeString):Int64;
- function ProfileRunning(const s: UnicodeString):Boolean;
- procedure Log(const s:UnicodeString);
- procedure MessageBox(const s:UnicodeString);
- function Execute(const s:UnicodeString; const TimeOutSeconds: Int64):Int64;
- function GetProfileName:UnicodeString;
- procedure SetProfileResult(const AResultText:UnicodeString);
- function CreateS3Connector(const BucketName,AccessID,SecretKey:UnicodeString;const Options:Integer):Opaque;
- function UploadFile(const LocalPath,DestinationPath:UnicodeString;const Connector:Opaque):Int64;
- function CloseConnector(const Connector:Opaque):Int64;
- function ConnFileExists(const Connector:Opaque; const FileName: UnicodeString):Boolean;
- function ConnDirectoryExists(const Connector:Opaque; const Name: UnicodeString):Boolean;
- function ConnCustomFTPCommand(const Connector:Opaque; const ACommand: UnicodeString;
const AOkResponse1,AOkResponse2,AOkResponse3:Integer;
var ResponseText: UnicodeString):Integer; - function ConnProcessWebForm(const Connector:Opaque;
const URL, AFormName, AField1, AValue1, AField2, AValue2: AnsiString;
const SaveResultPage: Boolean;
const SavePageFileName: UnicodeString): Boolean; - function ConnRenameFile(const Connector:Opaque; const AFromFileName,AToFileName: UnicodeString):Boolean;
- function ConnDeleteFile(const Connector:Opaque; const AFileName: UnicodeString):Boolean;
- function ConnDeleteFiles(const Connector:Opaque; const APath,AMask: UnicodeString):Integer;
- function ConnDeleteFilesOlderThan(const Connector:Opaque; const APath,AMask: UnicodeString;const AWhen:Double):Integer;
- function SendHTTPRequest(const requestype,mimetype,additionalheaders,URL,PostData:AnsiString;var ResultCode:Int64;var Response,ErrorResponse:AnsiString):Boolean;
- function StringReplace(const Source, OldPattern, NewPattern: UnicodeString;const CaseSensitive:Boolean): UnicodeString;
- function EncodeBase64(const s: UnicodeString):UnicodeString;
- function DecodeBase64(const s: UnicodeString):UnicodeString;
- function Utf8Encode(const s: UnicodeString):AnsiString;
- function Utf8Decode(const s: AnsiString):UnicodeString;
- function DecodeAnsiURL(const anurl:AnsiString):AnsiString;
- function DecodeUnicodeURL(const anurl:UnicodeString):UnicodeString;
- function UnicodeStringMD5Hex(const s: UnicodeString):UnicodeString;
- function EightBitStringMD5Hex(const s: AnsiString):AnsiString;
- function UnicodeStringMD5Base64(const s: UnicodeString):UnicodeString;
- function EightBitStringMD5Base64(const s: AnsiString):AnsiString;
- function UnicodeStringCRC32Hex(const s: UnicodeString):UnicodeString;
- function EightBitStringCRC32Hex(const s: AnsiString):AnsiString;
- function UnicodeStringCRC32Base64(const s: UnicodeString):UnicodeString;
- function EightBitStringCRC32Base64(const s: AnsiString):AnsiString;
- function SimpleEncrypt(const s: UnicodeString):UnicodeString;
- function SimpleDecrypt(const s: UnicodeString):UnicodeString;
- function AESEncrypt(const s,passphrase: UnicodeString):UnicodeString;
- function AESDecrypt(const s,passphrase: UnicodeString):UnicodeString;
- function ChooseFile(const Prompt,Extension:UnicodeString):UnicodeString;
- function OpenIniFile(const AFileName:UnicodeString):Int64;
- procedure CloseIniFile(const AnIni:Int64);
- function ReadIniString(const AnIni:Int64;const Section,Ident,Default:UnicodeString):UnicodeString;
- function GetInput(const s: UnicodeString):UnicodeString;
- function GetPassword(const s: UnicodeString):UnicodeString;
- function ReadRegistryString(const Key,OptName:UnicodeString):UnicodeString;
- procedure WriteRegistryString(const Key,OptName,Value:UnicodeString);
- function GetProfileRunID:UnicodeString;
- procedure ClearBody;
- function GetBodyLine(const i:Integer):UnicodeString;
- procedure SetBodyLine(const i:Integer;const s:UnicodeString);
- procedure DeleteBodyLine(const i:Integer);
- procedure AddBodyText(const s:UnicodeString);
- function GetActionList:UnicodeString;
- function GetProfileSettings:UnicodeString;
- function Now:Double;
- function NowUTC:Double;
- function OffsetFromUTC:Double;
- function TimeToStr(const DateTime: Double):UnicodeString;
- function DateTimeToStr(const DateTime: Double):UnicodeString;
- function DateToStr(const DateTime: Double):UnicodeString’;
- function DateTimeToStrWithFormat(const DateTime: Double;const FormatString:UnicodeString):UnicodeString;
- function MakeSurePathExists(const s:UnicodeString;const isRightSide:Boolean):Boolean;
- function GetTempDir:UnicodeString;
- function GetTempFilename(const TryCreateIt:Boolean;const Extension:UnicodeString):UnicodeString;
- function PathDelim:UnicodeString;
- function LeftDelim:UnicodeString;
- function RightDelim:UnicodeString;
- function GetDelim(const Connector: Opaque):UnicodeString;
- function IncludeLeadingPathDelim(const s: UnicodeString):UnicodeString;
- function OpenTextFile(const s:UnicodeString):Opaque;
- function AppendTextFile(const s:UnicodeString):Opaque;
- function CreateTextFile(const s:UnicodeString):Opaque;
- procedure WriteLine(const F:Opaque;const ALine:UnicodeString);
- function ReadLine(const F:Opaque):UnicodeString;
- function EOF(const F:Opaque):Boolean;
- procedure CloseFile(const F:Opaque);
- function AtomicAppendTextFileLine(const APath,ALine:UnicodeString):Boolean;(añade una línea de forma segura para múltiples hilos y múltiples procesos)
- function YearOf(const dt:Double):Integer;
- function MonthOf(const dt:Double):Integer;
- function WeekOf(const dt:Double):Integer;
- function DayOf(const dt:Double):Integer;
- function DayOfTheWeek(const dt:Double):Integer;
- function SecondOf(const dt:Double):Integer;
- function HourOf(const dt:Double):Integer;
- function MinuteOf(const dt:Double):Integer;
- function EncodeDateTime(const AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond: Integer): Double;
- function FileToCopyExistsLeft:Boolean;
- function FileToCopyExistsRight:Boolean;
- function FileToCopyLeftSize:Int64;
- function FileToCopyRightSize:Int64;
- function FileToCopyLeftModified:Double;
- function FileToCopyRightModified:Double;
- function CurrentFileModified:Double;
- function CurrentFileCreated:Double;
- function CurrentFileLastAccessed:Double;
- procedure CountDeletedFiles(const Left,Right:Integer);
(puede usarse con comodines en el nombre de archivo, pero no en las carpetas superiores)
Variables globales disponibles
Estas variables globales permiten el acceso directo a los campos internos de Syncovery. Algunas deben considerarse de solo lectura, mientras que otras están pensadas para modificarse según sea necesario.
- ProfileTempDir: UnicodeString;
- LeftBasePath: UnicodeString;
- RightBasePath: UnicodeString;
- ProfileName: UnicodeString;
- ResultSummary: UnicodeString;
- LeftBindIP: UnicodeString;
- RightBindIP: UnicodeString;
- MinimumFreeSpaceLeft: Int64;
- MinimumFreeSpaceRight: Int64;
- MaxWaitWhenFreeSpaceLowSeconds: Integer;
- MinDate: Double;
- MaxDate: Double;
- FilterTimestamps: Boolean;
- FilterOnSourceSideOnly: Boolean;
- FiltersMustMatchOnBothSides:Boolean;
- NeedActionsLog: Boolean;
- UseBinaryCompToAvoidCopying: Boolean;
- RemoveEmptyFoldersOnlyOneLevelWhereAFileHasBeenRemoved: Boolean;
- IgnoreFileSizes: Boolean;
- SkipIfFileSizeChanging: Boolean;
- ActionsLogging: Boolean;
- FreeSpaceLogging: Boolean;
- CopyingStatisticsLogging: Boolean;
- FileCopyNoStatNeeded: Boolean;
- DoSmartTrackingDeletionsEvenIfOtherSideModified: Boolean;
Script de ejemplo OnActionComplete
Este hook se invoca después de que se haya realizado cualquier tipo de acción relacionada con archivos o carpetas, como copiar, mover o eliminar un archivo, etc. El ejemplo solo registra la acción. El resultado de la función es ignorado por Syncovery.
function OnActionComplete(const StartTimeUTC, CompletionTimeUTC: Double;
const Success: Boolean;
const ActionStr, DirectionStr, Filename,
LeftFile, RightFile, Subfolder, MovedTo,
ErrorMsg: UnicodeString;
const ResultCode: Int64;
const ErrorSide: UnicodeString;
const ASize,ACompressedSize:Int64):Boolean;
begin
Log('Action Complete: '+ActionStr+' '+DirectionStr+' '+Filename);
Result:=true;
end;
Script de ejemplo de OnAfterFileCopy
Este hook se invoca después de que se haya copiado un archivo. El resultado de la función es ignorado por Syncovery. Lo utiliza el script de ejemplo “Eliminar los archivos de más de 30 días del lado de origen (izquierdo)”.
function OnAfterFileCopy(const DirectionIsL2R:Boolean;
const Source,Dest,DestPath,LeftSubPath,RightSubPath:UnicodeString;
const ResultCode:Int64):Boolean;
begin
Log('File Copy Complete: '+Source+' to '+Dest);
Result:=true;
end;
Script de ejemplo de OnCanRunProfile
Este hook se invoca cuando el programador está a punto de ejecutar un perfil. Puede decidir si realmente debe ejecutarse ahora o si debe posponerse. El ejemplo utiliza el hook para evitar que dos perfiles concretos se ejecuten al mismo tiempo o se solapen. Este script debe introducirse como un PascalScript global mediante el cuadro de diálogo Configuración del programa, en la pestaña Avanzado.
const p1='Profile Name 1';
p2='Profile Name 2';
function OnCanRunProfile(const ProfileName:UnicodeString; var PostponeBySeconds:Integer):Boolean;
begin
if ProfileName=p1 then
Result:=not ProfileRunning(p2)
else
if ProfileName=p2 then
Result:=not ProfileRunning(p1)
else
Result:=true;
if not Result then
PostponeBySeconds:=60;
end;
Script de ejemplo de OnFileCopy
Este hook le permite reemplazar la lógica de copia de archivos. Devuelva 0 si todo va bien, -1 si Syncovery debe realizar la copia como de costumbre, o cualquier otro valor como código de error.
function OnFileCopy(const DirectionIsL2R:Boolean;
const Source,Dest,DestPath,LeftSubPath,RightSubPath:UnicodeString;
const SourceConnector,DestConnector: Opaque):Int64;
begin
Result:=Execute('XCOPY.EXE "'+Source+'" "'+DestPath+'"',60);
end;
Script de ejemplo de OnGetCustomHeaders
Este hook le permite añadir encabezados HTTP personalizados a las solicitudes de Amazon S3. En futuras versiones de Syncovery, esta función podrá añadirse a otros almacenamientos en la nube y protocolos (a petición del cliente; solo tiene que pedirlo).
function OnGetCustomHeaders(const RelativePath: UnicodeString;
const URL:AnsiString;var MIMEType, Headers: AnsiString;
const Connector:Opaque):Boolean;
var strDate:string;
begin
Result:=true;
Headers:='Cache-Control: 10';
Log('');
Log('Headers Added to '+RelativePath);
Log(Headers);
Log('');
end;
Script de ejemplo de OnGetNextRunTime
Este hook le permite modificar la planificación. La mejor forma de usarlo es asignar al perfil una planificación sencilla y regular, y utilizar el hook para omitir los horarios de ejecución no deseados. Este ejemplo está pensado para un perfil programado para ejecutarse “cada día a XX:YY”. El hook garantiza que, en realidad, solo se ejecute el primer día laborable de cada mes.
function OnGetNextRunTime(const LastRun, ProposedNextRun: Double):Double;
var DidItRunThisMonth:Boolean;
begin
Result:=ProposedNextRun;
DidItRunThisMonth:=(MonthOf(LastRun)=MonthOf(Now)) and
(MonthOf(LastRun)=MonthOf(ProposedNextRun)) and
(DayOf(LastRun)<DayOf(ProposedNextRun));
if DidItRunThisMonth then begin
// go to the next month
while DayOf(Result)>1 do
Result:=Result+1;
end
else begin
// go to the next month if we are beyond week #1
while DayOf(Result)>7 do
Result:=Result+1;
end;
// second, advance further until it's not a weekend
while DayOfTheWeek(Result)>=6 do
Result:=Result+1;
end;
Scripts de ejemplo de OnIncludeItem
El hook OnIncludeItem se llama individualmente para cada lado de la sincronización. El parámetro isRightSide indica qué lado estamos viendo en ese momento.
El siguiente script sirve para excluir archivos sin extensión de nombre de archivo. Este tipo de exclusión no es posible mediante las máscaras de exclusión.
function OnIncludeItem(const FileName, RelativePath: UnicodeString;
const isRightSide, isFolder:Boolean;
const FileSize:Int64; const FileAttr:LongWord;
const Connector: Opaque):Boolean;
begin
Result:=isFolder or (Pos('.',FileName)>0);
end;
El segundo ejemplo de OnIncludeItem solo procesará las subcarpetas que contengan el archivo READY.toprocess, así como cualquier subcarpeta que exista en el lado derecho.
function OnIncludeItem(const FileName, RelativePath: UnicodeString;
const isRightSide, isFolder:Boolean;
const FileSize:Int64; const FileAttr:LongWord;
const Connector: Opaque):Boolean;
begin
Result:=isRightSide or not isFolder or
ConnFileExists(Connector,ConcatPath(ConcatPath(LeftBasePath,RelativePath,Connector),FileName,Connector)+
'\READY.toprocess');
end;
Script de ejemplo de OnScanFolder
Probablemente esta sea una mejor forma de buscar “READY.toprocess”. El hook OnScanFolder se invoca justo antes de que se escanee la carpeta, y en el hook se puede aprovechar el conocimiento de ambos lados.
function OnScanFolder(const FolderLevel: Integer;
const RelativePath, LeftCompletePath, RightCompletePath: UnicodeString;
const LeftExists,RightExists:Boolean;
const LeftConnector, RightConnector: Opaque):Boolean;
begin
Result:=RightExists or ConnFileExists(LeftConnector,LeftCompletePath+'\READY.toprocess');
end;
Script de ejemplo de OnProfileStart
Esta función puede usarse para comprobar o modificar la configuración del perfil al iniciar el programa, incluidas algunas funciones que solo pueden habilitarse mediante PascalScript. El ejemplo comprueba si hay marcadas casillas de “Bypass File Buffering” y las elimina.
var Checked:Boolean;
function OnProfileStart:Boolean;
begin
Result:=true;
if Checked then
Exit;
Checked:=true;
if (GetProfileProperty('BypassOSFileBufferingLeft')='Yes') or
(GetProfileProperty('BypassOSFileBufferingRight')='Yes') then begin
SetProfileProperty('BypassOSFileBufferingLeft','No');
SetProfileProperty('BypassOSFileBufferingRight','No');
SaveProfileSettings;
Log('');
Log('Bypass File Buffering has been removed via PascalScript.');
end
else begin
Log('');
Log('File buffering settings have been verified via PascalScript.');
end;
end;
Script de ejemplo de OnProfileResults
Este script no hace nada, pero la función se invoca con algunas estadísticas cuando un perfil finaliza. Puede descargarse un ejemplo con un uso real cerca de la parte superior de esta página (“Enviar notificaciones por correo electrónico según los resultados del perfil”). El valor de retorno de esta función (“Result”) se ignora.
function OnProfileResults(const FilesCopiedL2R,FilesCopiedR2L:Integer;
const FilesToCopyL2R,FilesToCopyR2L:Integer;
const BytesCopiedL2R,BytesCopiedR2L:Int64;
const ResultString:UnicodeString;
const Error:Boolean):Boolean;
begin
Result:=true;
end;
Script de ejemplo de OnNormalizeFilename
Este hook le permite “normalizar” nombres de archivo para que Syncovery pueda verlos como idénticos a pesar de pequeñas diferencias. El script de ejemplo normaliza los caracteres de espacio, de modo que siempre haya solo un carácter de espacio entre otros caracteres. Dos o más espacios consecutivos se normalizan a uno solo. El resultado es que Syncovery considera idénticos archivos que tienen distinto número de espacios consecutivos en cada lado del perfil. Estos nombres de archivo no se modifican en el disco. La modificación es puramente en memoria, con fines de comparación. La vista previa de sincronización mostrará los nombres de archivo normalizados.
function OnNormalizeFilename(const FileName: UnicodeString;
const isFolder, isRightSide: Boolean):UnicodeString;
var Changed:UnicodeString;
begin
Result:=FileName;
repeat
Changed:=StringReplace(Result,' ',' ',true);
if Changed=Result then
break;
Result:=Changed;
until false;
end;
Script de ejemplo de OnReplaceFilenameLeftToRight
Este script cambiará el nombre de los archivos cuando se copien de izquierda a derecha. En nuestro ejemplo, se añade “-draft” antes de la extensión del archivo.
function OnReplaceFilenameLeftToRight(const FileName: UnicodeString;
const isFolder: Boolean):UnicodeString;
begin
if isFolder then
Result:=FileName
else
Result:=ChangeFileExt(FileName,'-draft')+ExtractFileExt(FileName);
end;
Script de ejemplo de OnReplaceFilenameRightToLeft
Si realiza una sincronización bidireccional y pueden aparecer archivos nuevos en el lado derecho, también necesitamos una forma de cambiar el nombre en la otra dirección. Este script de ejemplo elimina el inserto “-draft” de los nombres.
function OnReplaceFilenameRightToLeft(const FileName: UnicodeString;
const isFolder: Boolean):UnicodeString;
var ToFind:UnicodeString;
P:Integer;
begin
if isFolder then
Result:=FileName
else begin
ToFind:=''-draft''+ExtractFileExt(FileName);
p:=Pos(ToFind,FileName);
if p>0 then
Result:=Copy(FileName,1,p-1)+ExtractFileExt(FileName)
else
Result:=FileName
end;
end;
Script de ejemplo de OnUploadComplete
Este script establecerá permisos 777 para los archivos subidos por FTP.
function OnUploadComplete(const FileName, LocalFilePath, CompleteURL: UnicodeString;
const isRightSide:Boolean;
const FileSize:Int64;
const Connector: Opaque):Boolean;
var CmdRes:Int64;
ResponseText:UnicodeString;
begin
CmdRes:=ConnCustomFTPCommand(Connector,'SITE CHMOD 777 '+FileName,200,200,200,ResponseText);
Log('Set Permissions for '+FileName+': '+ResponseText);
Result:=true;
end;
Script de ejemplo de OnDownloadComplete
Este script cambiará el nombre de los archivos descargados añadiendo una extensión adicional “.downloaded”.
function OnDownloadComplete(const FileName, CompleteURL, LocalFilePath: UnicodeString;
const isRightSide:Boolean;
const FileSize:Int64;
const Connector: Opaque):Boolean;
begin
if ConnRenameFile(Connector,CompleteURL,FileName+'.downloaded') then
Log('Renamed '+FileName+' to '+FileName+'.downloaded')
else
Log('Rename failed: '+FileName+' to '+FileName+'.downloaded');
Result:=true;
end;
Script de ejemplo de OnVolumeShadowComplete
Este script ejecutará un comando externo (archivo por lotes o CMD) justo después de que se haya creado una instantánea de volumen.
function OnVolumeShadowComplete(const Volume,ShadowPath:UnicodeString):Boolean;
begin
Result:=Execute('C:\Tests\test.bat',120)=0;
end;
Script de ejemplo de OnBeforeFolderCreate
Este script impedirá la creación de cualquier carpeta, salvo cuando sea necesario para copiar archivos al destino. También puede usar este hook para manipular las rutas de carpetas en el destino.
function OnBeforeFolderCreate(const DirectionIsL2R:Boolean;
var Source,Dest,Reason:UnicodeString):Boolean;
begin
Result:=false;
end;
Script de ejemplo de OnBeforeFileCopy
Este script manipulará las rutas de destino para la copia (de izquierda a derecha), añadiendo una subcarpeta adicional llamada ‘archive’ que no existe en el lado de origen.
function OnBeforeFileCopy(const DirectionIsL2R:Boolean;
var Source,Dest,DestPath,LeftSubPath,RightSubPath:UnicodeString):Boolean;
var AddFolderName,NewDestPath,NewDest,NewRightSubPath:UnicodeString;
begin
Result:=true;
if not DirectionIsL2R then
Exit;
AddFolderName:='archive';
NewDestPath:=ConcatPathWithDelim(DestPath,AddFolderName,PathDelim);
NewDest:=ConcatPathWithDelim(NewDestPath,ExtractFileName(Dest),PathDelim);
NewRightSubPath:=IncludeLeadingPathDelim(ConcatPathWithDelim(RightSubPath,AddFolderName,PathDelim));
if not MakeSurePathExists(NewDestPath,true) then begin
Log('Could not create '+NewDestPath);
Exit;
end;
Log('OnBeforeFileCopy');
Log('Source:'+Source);
Log('DestPath:'+DestPath+' changed to '+NewDestPath);
Log('Dest:'+Dest+' changed to '+NewDest);
Log('LeftSubPath:'+LeftSubPath);
Log('RightSubPath:'+RightSubPath+' changed to '+NewRightSubPath);
Log('');
Dest:=NewDest;
DestPath:=NewDestPath;
RightSubPath:=NewRightSubPath;
end;
Script de ejemplo de OnBeforeFileUpload
Este script se llama antes de una subida de archivo a través del protocolo de Internet y puede utilizarse para modificar el comportamiento de la subida. La función de ejemplo siguiente invocará un analizador antivirus antes de la subida.
function OnBeforeFileUpload(const DirectionIsL2R:Boolean;
var Source,Dest,DestPath,LeftSubPath,RightSubPath,ErrorMsg:UnicodeString;
var ErrorCode:Int64):Boolean;
begin
if not DirectionisL2R then begin
Result:=true;
Exit;
end;
Result:=Execute('"C:\Program Files\ClamAV\clamscan.exe" '+Source,60)=0;
if Result then
Log('Virus scan OK: '+Source)
else begin
Log('Virus scan failed, not uploading: '+Source);
ErrorMsg:='Virus detected';
ErrorCode:=$E1;
end;
end;
Script de ejemplo de OnHttpPost
Este hook puede utilizarse para habilitar la subida de archivos mediante el protocolo HTTP. El script debe establecer las cabeceras y propiedades de formulario pertinentes.
function OnHttpPost(const RelativePath : UnicodeString;
var URL, MIMEType, Header : AnsiString; var LAsForm : Boolean;
var LFormData : AnsiString;
const Connector : Opaque) : Boolean;
begin
URL := 'https://es.syncovery.com';
Header := 'Authorization: Bearer abcdefghijklmnopqrstuvwxyz';
LAsForm := true;
Result := true;
LFormData := 'orderstates';
Log('');
Log('Header Added to '+RelativePath);
Log(Header);
Log('');
end;
Script de ejemplo de OnGetProfilePathBeforeListing
Este script utiliza este hook para especificar una carpeta TEMP independiente para el perfil. El propósito original de la función es modificar la ruta izquierda o derecha y/o las credenciales.
function OnGetProfilePathBeforeListing(const isRightSide:Boolean;
var Path,UserName,Password:UnicodeString;
var AuthKey,AuthKeyPassword:AnsiString;
var Port:Integer):Boolean;
begin
ProfileTempDir:='H:\TEMP';
Result:=true;
end;
Script de ejemplo de OnGetProfilePathBeforeCopying
Este hook puede utilizarse para modificar la ruta y/o las credenciales. El script de ejemplo no hace nada.
function OnGetProfilePathBeforeCopying(const isRightSide:Boolean;
var Path,UserName,Password:UnicodeString;
var AuthKey,AuthKeyPassword:AnsiString;
var Port:Integer):Boolean;
begin
Result:=true;
end;
Script de ejemplo de OnBeforeMainActionPhase
Este script permite que el trabajo se ejecute solo si se va a copiar un número fijo de archivos de izquierda a derecha.
function OnBeforeMainActionPhase(const CopyL2RCount,CopyR2LCount,DeleteLCount,DeleteRCount,MoveLCount,MoveRCount:Int64;
const CopyL2RBytes,CopyR2LBytes,DeleteLBytes,DeleteRBytes,MoveLBytes,MoveRBytes:Int64):Boolean;
begin
if CopyL2RCount=14 then
Result:=true
else begin
Result:=false;
Log('Not continuing because CopyL2RCount is '+IntToStr(CopyL2RCount));
end;
end;
Script de ejemplo de OnCloudConnect
Este script puede utilizarse para iniciar sesión en un sitio web cuando se usa el protocolo HTTP para descargar archivos desde una URL.
function OnCloudConnect(const URL:AnsiString;
const isRightSide,isFirstConnectionInJob:Boolean;
const Connector: Opaque):Boolean;
begin
if isFirstConnectionInJob and not isRightSide then
Result:=ConnProcessWebForm(Connector,
'https://www.superflexible.com/usrlogin.php?',
'login',
'username','tobias',
'password','abcdefghijklmn',
false,'')
else
Result:=true;
end;
Script de ejemplo de OnCloudDisconnect
Este gancho se invoca antes de la desconexión final de un servidor en la nube o FTP al final de la ejecución de un perfil.
Puede utilizarse para realizar algunas tareas finales.
El script de ejemplo no hace nada.
function OnCloudDisconnect(const URL:AnsiString;
const isRightSide,isMainConnectionInJob,isFinalDisconnection:Boolean;
const Connector: Opaque):Boolean;
begin
Log('Before final disconnection');
Result:=true;
end;
Script de ejemplo de OnLogFileClosed
Este script copia el archivo de registro a otra carpeta después de que el archivo de registro se haya cerrado.
function OnLogFileClosed(const FileName:UnicodeString):Boolean;
begin
FileCopy(FileName,'E:\LogCopies\'+ExtractFileName(FileName));
Result:=true;
end;
Script de ejemplo de OnMoveFileToDeletedFolder
Este script evita conservar varias versiones de archivos eliminados borrando primero el archivo que pudiera existir en la carpeta de archivos eliminados.
function OnMoveFileToDeletedFolder(const Path:UnicodeString;
var MoveToPath:UnicodeString;
var proceedToDeleteInsteadOfMoving:Boolean;
const Connector:Opaque):Boolean;
begin
if FileExists(MoveToPath) then FileDelete(MoveToPath);
Result:=true;
end;
Script de ejemplo de OnNeedToRerun
Este script hace que el trabajo se vuelva a ejecutar hasta que se haya cumplido la condición esperada (se ha copiado al menos un archivo).
function OnNeedToReRun(const FilesCopiedL2R,FilesCopiedR2L:Integer;
const FilesToCopyL2R,FilesToCopyR2L:Integer;
const BytesCopiedL2R,BytesCopiedR2L:Int64;
const ResultString:UnicodeString;
const Error:Boolean):Boolean;
begin
if FilesCopiedL2R+FilesCopiedR2L>0 then
Result:=false
else
Result:=true;
end;
