Este es un programa hace una copia una carpeta de forma incremental y guardando revisiones de los archivos modificados.
Luego envia por mail el resultado de la copia.
Todo el código lo he recopilado de muchas fuentes (sobre todo de este foro) y lo he ido juntando para que haga este tipo de backup.
Los parametros necesarios los lee de un .ini.
Este es el parametros.ini
Código: Seleccionar todo
[rutas]
umbral_espacio_libre_en_disco=20
origen=C:\Documents and Settings\Administrador\Escritorio\origen
unidad_mapeo_origen=O:
usuario_origen=
password_origen=
destino=C:\Documents and Settings\Administrador\Escritorio\destino
unidad_mapeo_destino=Q:
usuario_destino=
password_destino=
log=C:\Documents and Settings\Administrador\Escritorio\destino\logs
unidad_mapeo_log=
usuario_log=
password_log=
[mail]
enviamail=1
username=MiUsuario
password=MiContraseña
smtp=mail.dominio.com
from_name=MiNombre
[email protected]
[email protected]
cc_address=
bcc_address=
port=25
ssl=0
importance=Normal
subject=Resultado de la copia
body=Resultado de la copia
attachfile=
[planificacion]
cadencia=*/1 * * * *
[compresion]
revisiones=1
Código: Seleccionar todo
;##################################
; Inicio del Script
;##################################
#Region ; Script principal
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_outfile=Cron 64 bits.exe
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;Opt("RunErrorsFatal", 0)
#Region ; Includes
#include <Date.au3>
#include <file.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GDIPlusConstants.au3>
#include <GUIConstantsEx.au3>
#EndRegion ; Includes
Opt("trayicondebug", 1)
Opt("GUIOnEventMode", 1)
#Region ; Variables
;##################################
; Inicio declaración de Variables
;##################################
;MsgBox(0, "¿Donde estoy?", "Funcion Principal")
;Variables para el CRON.
$segundos = 0
$y = 0
Dim $subcom[6]
$subcom[0] = 0
$subcom[1] = 0
$subcom[2] = 0
$subcom[3] = 0
$subcom[4] = 0
$subcom[5] = 0
;Para el comodin.
$Iminutos = Number(@MIN)
$Ihoras = Number(@HOUR)
$Imes = Number(@MON)
$Idia_mes = Number(@MDAY)
$Idia_semana = Number(@WDAY) - 1
;Variables Globales.
;Variables globales del proceso de copia.
;Flags
Global $Recursivo=1 ;Siempre debe estar a 1 si queremos que sea recursivo.
Global $parametros = @ScriptDir & "\ConfiguracionCopia.ini"
;Rutas
Global $UmbralEspacioLibreEnDisco = 0
Global $Logs = 0
Global $BackupDesdeInicio = 0
Global $BackupHaciaCarpeta = 0
Global $CarpetaRevisiones = 0
Global $Revisiones=0
;Contadores
Global $ErrorAlCopiar=0
Global $Actualizado=0
Global $SinModificar=0
Global $Nuevo=0
Global $Revisado=0
Global $folders=0
Global $DuracionCopia=0
Global $TiempoDaemonUp=0
;Pesajes
Global $PesoDelOrigen=0
Global $PesoDeArchivosCopiados=0
Global $PesoDeArchivosRevisados=0
Global $EspacioTotalEnDiscoDestino=0
Global $EspacioLibreEnDiscoDestino=0
Global $PorcentageEspacioLibreEnDiscoDestino=0
;Tiempos
Global $InicioCopiaEnTexto = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC
Global $InicioCopia = _NowCalc()
Global $DuracionCopia=0
Global $InicioDaemon = _NowCalc()
Global $TiempoDaemonUpEnSegundos = 0
Global $TiempoDaemonUpEnMinutos = 0
Global $TiempoDaemonUpEnHoras = 0
Global $TiempoDaemonUpEnDias = 0
;Variables globales para enviar el mail.
Global $oMyRet[2]
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
Global $EnviaMail = IniRead( $parametros, "mail", "enviamail", "" )
Global $Username = IniRead( $parametros, "mail", "username", "" )
Global $Password = IniRead( $parametros, "mail", "password", "" )
Global $SmtpServer = IniRead( $parametros, "mail", "smtp", "" )
Global $FromName = IniRead( $parametros, "mail", "from_name", "" )
Global $FromAddress = IniRead( $parametros, "mail", "from_address", "" )
Global $ToAddress = IniRead( $parametros, "mail", "to_address", "" )
Global $CcAddress = IniRead( $parametros, "mail", "cc_address", "" )
Global $BccAddress = IniRead( $parametros, "mail", "bcc_address", "" )
Global $IPPort = Int(IniRead( $parametros, "mail", "port", "" ))
Global $ssl = Int(IniRead( $parametros, "mail", "ssl", "" ))
Global $Importance = IniRead( $parametros, "mail", "importance", "" )
Global $Subject = IniRead( $parametros, "mail", "subject", "" )
Global $Body = IniRead( $parametros, "mail", "body", "" )
Global $AttachFiles = IniRead( $parametros, "mail", "attachfile", "" )
;Variables Globales para la compresion.
Global $ComprimoLaRevision = IniRead( $parametros, "compresion", "revisiones", "" )
_GDIPlus_Startup()
Global $hGui = GUICreate("", 800, 200)
Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
Global $hBitmapBuffer = _GDIPlus_BitmapCreateFromGraphics(800, 200, $hGraphics)
Global $hGraphicsBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmapBuffer)
_GDIPlus_GraphicsClear($hGraphicsBuffer, 0xFF000000)
Global $hBitmapLed = 0
;##################################
; Fin declaración de Variables
;##################################
#EndRegion ; Variables
;--------- Archivo de registro ------------
$fileReg = FileOpen(@ScriptDir & "\Registro de Backup.log", 1)
If $fileReg = -1 Then
;MsgBox(0, "Error", "No se puede abrir archivo.")
EndIf
FileWriteLine($fileReg, "")
FileWriteLine($fileReg, "Comienzo de Backup ( " & @HOUR & ":" & @MIN & " " & @MDAY & " de " & @MON & " de " & @YEAR & " )")
FileWriteLine($fileReg, "---------------------------------------------")
FileClose($fileReg)
;--------- Bucle principal de la aplicación-------------
While 1
Dim $par[6]
$minutos = Number(@MIN)
$par[1] = Number(@MIN)
$horas = Number(@HOUR)
$par[2] = Number(@HOUR)
$mes = Number(@MON)
$par[3] = Number(@MON)
$dia_mes = Number(@MDAY)
$par[4] = Number(@MDAY)
$dia_semana = Number(@WDAY) - 1
$par[5] = Number(@WDAY)
$espera = 60000
abrir() ; Testea la programacion de la copia.
;------------- reaguste de tiempos ------------
$segundos = (@SEC) * 1000
;If 0 < @SEC Then
; $segundos = (@SEC) * 1000
;EndIf
$espera = $espera - $segundos
;----------------------------------------------
Sleep($espera); pausa 60 segundos 1 minuto
WEnd
#EndRegion ; Script principal
;##################################
; Fin del Script
;##################################
;##################################
; Funciones
;##################################
;--------- Revisa la cadencia del ini -----------
Func abrir()
;Lee la programación CRON.
$RevisaLaProgramacion = IniRead( $parametros, "planificacion", "cadencia", "" )
;Saca el primer caracter para comprobar comentarios
$primero = StringMid($RevisaLaProgramacion, 1, 1)
;Compara el primer carancter. Si es un numero o comodin pasa a FunRum
If StringIsDigit($primero) Or StringInStr($primero, "*") Or StringInStr($primero, "I") Or StringInStr($primero, "i") = 1 Then
FunRum($RevisaLaProgramacion)
EndIf
$subcom[0] = 0
EndFunc ;==>abrir
Func FunRum($RevisaLaProgramacion)
;Reduce espacios.
$RevisaLaProgramacion = StringStripWS($RevisaLaProgramacion, 4)
;Divide linea $parametros[1]=$minuto $parametros[2]=$hora $parametros[3]=$dia_mes $parametros[4]=$mes $parametros[5]=$dia_semana $parametros[6..]=comando
$parametros = StringSplit($RevisaLaProgramacion, " ")
;---------- Proceso del comodin (I) -----------------
If $parametros[1] = "I" Or $parametros[1] = "i" Then
$parametros[1] = $Iminutos
EndIf
If $parametros[2] = "I" Or $parametros[2] = "i" Then
$parametros[2] = $Ihoras
EndIf
If $parametros[3] = "I" Or $parametros[3] = "i" Then
$parametros[3] = $Idia_mes
EndIf
If $parametros[4] = "I" Or $parametros[4] = "i" Then
$parametros[4] = $Imes
EndIf
If $parametros[5] = "I" Or $parametros[5] = "i" Then
$parametros[5] = $Idia_semana
EndIf
If Number($parametros[5]) = 0 And StringMid($parametros[5], 1, 1) <> "*" Then
$parametros[5] = 7
EndIf
If $dia_semana = 0 Then
$dia_semana = 7
EndIf
If $par[5] = 0 Then
$par[5] = 7
EndIf
;---------------------------------------------------
Dim $multiples[6]
Dim $rango[6]
$subcom[0] = 0
$subcom[1] = 0
$subcom[2] = 0
$subcom[3] = 0
$subcom[4] = 0
$subcom[5] = 0
For $p = 1 To 5
If StringInStr($parametros[$p], ",") Then
;multiples
$mul = StringSplit($parametros[$p], ",")
For $p2 = 1 To $mul[0]
;
If Number($mul[$p2]) = $par[$p] Then
$multiples[$p] = 1
EndIf
Next
Else
;MsgBox(0, "¿Cual es el rango?", $parametros[$p])
If StringInStr($parametros[$p], "-") Then
;rango
$ran = StringSplit($parametros[$p], "-")
;MsgBox(0, "¿Cual es el rango?", $ran[1] & @CRLF & $ran[2])
;MsgBox(0, "¿Donde estamos exactamente ahora ?", $par[$p])
If Number($ran[1]) <= $par[$p] And Number($ran[2]) >= $par[$p] Then
$rango[$p] = 1
;MsgBox(0, "¿Estoy dentro del rango?", "SI " & $rango[$p])
EndIf
EndIf
EndIf
;---------------------- Incremento -----------------------
If StringInStr($parametros[$p], "/") > 0 Then ;1
$ss = StringSplit($parametros[$p], "/")
If $minutos = 0 Then
$minutos = 60
EndIf
If $par[1] = 0 Then
$par[1] = 60
EndIf
If Number($horas) = 0 Then
$horas = 24
EndIf
If $par[2] = 0 Then
$par[1] = 24
EndIf
If Mod($par[$p], Number($ss[2])) = 0 Then
$subcom[$p] = 0
Else
$subcom[$p] = 1
EndIf
If $minutos = 60 Then
$minutos = 0
EndIf
If $par[1] = 60 Then
$par[1] = 0
EndIf
If $horas = 24 Then
$horas = 0
EndIf
If $par[2] = 24 Then
$par[2] = 0
EndIf
Else
$subcom[$p] = 0
EndIf
;----------------------------------------------------------
;---------------------------------------------------------
Next
;---------- Comprobaciones -------------------------
If (Number($parametros[1]) = $minutos Or StringMid($parametros[1], 1, 1) = "*" Or $multiples[1] Or $rango[1]) And $subcom[1] = 0 Then
If (Number($parametros[2]) = $horas Or StringMid($parametros[2], 1, 1) = "*" Or $multiples[2] Or $rango[2]) And $subcom[2] = 0 Then
If (Number($parametros[3]) = $dia_mes Or StringMid($parametros[3], 1, 1) = "*" Or $multiples[3] Or $rango[3]) And $subcom[3] = 0 Then
If (Number($parametros[4]) = $mes Or StringMid($parametros[4], 1, 1) = "*" Or $multiples[4] Or $rango[4]) And $subcom[4] = 0 Then
If (Number($parametros[5]) = $dia_semana Or StringMid($parametros[5], 1, 1) = "*" Or $multiples[5] Or $rango[5]) And $subcom[5] = 0 Then
;ejecuta la expresión
correcto($parametros)
EndIf
EndIf
EndIf
EndIf
EndIf
$multiples = 0
$rango = 0
EndFunc ;==>FunRum
;----------------- todo correcto -----------------
Func correcto($parametros)
;MsgBox(0, "¿Donde estoy?", "Funcion correcto")
Backup()
$fileReg = FileOpen(@ScriptDir & "\Registro de Backup.log", 1)
If $fileReg = -1 Then
;MsgBox(0, "Error", "No se puede abrir archivo.")
EndIf
$TiempoDaemonUpEnSegundos = _DateDiff("s", $InicioDaemon, _NowCalc())
$TiempoDaemonUpEnMinutos = $TiempoDaemonUpEnSegundos / 60
$TiempoDaemonUpEnSegundos = Mod($TiempoDaemonUpEnSegundos, 60)
$TiempoDaemonUpEnSegundos = Round($TiempoDaemonUpEnSegundos)
$TiempoDaemonUpEnHoras = $TiempoDaemonUpEnMinutos / 60
$TiempoDaemonUpEnMinutos = Mod($TiempoDaemonUpEnMinutos, 60)
$TiempoDaemonUpEnMinutos = Round($TiempoDaemonUpEnMinutos)
$TiempoDaemonUpEnDias = $TiempoDaemonUpEnHoras / 24
$TiempoDaemonUpEnDias = Round($TiempoDaemonUpEnDias)
$TiempoDaemonUpEnHoras = Mod($TiempoDaemonUpEnHoras, 4)
$TiempoDaemonUpEnHoras = Round($TiempoDaemonUpEnHoras)
FileWriteLine($fileReg, @HOUR & ":" & @MIN & ":" & @SEC & " " & @MDAY & "/" & @MON & "/" & @YEAR & @CRLF & " Tiempo en marcha: " & $TiempoDaemonUpEnDias & "D " & $TiempoDaemonUpEnHoras & "H " & $TiempoDaemonUpEnMinutos & "M " & $TiempoDaemonUpEnSegundos & "S " & @CRLF & " Libre en disco: " & $PorcentageEspacioLibreEnDiscoDestino & "%" & @CRLF & " Nuevos: " & $Nuevo & @CRLF & " Actualizados: " & $Actualizado & @CRLF & " Revisados: " & $Revisado & @CRLF & " Errores: " & $ErrorAlCopiar & @CRLF & " Sin modificar: " & $SinModificar & @CRLF & @CRLF)
FileClose($fileReg)
EndFunc ;==>correcto
Func Backup()
;MsgBox(0, "¿Donde estoy?", "Funcion Backup")
;Puesta a cero de variables.
;Variables iniciadoras.
$parametros = @ScriptDir & "\ConfiguracionCopia.ini"
;Variables globales del proceso de copia.
;Flags
$Recursivo=1 ;Siempre debe estar a 1 si queremos que sea recursivo.
;Rutas
$UmbralEspacioLibreEnDisco = IniRead($parametros, "rutas", "umbral_espacio_libre_en_disco", "")
$Logs = IniRead($parametros, "rutas", "log", "")
$BackupDesdeInicio = IniRead($parametros, "rutas", "origen", "")
$BackupDesdeInicioAntesDeMapear = $BackupDesdeInicio
;MsgBox(0, "¿Origen?", $BackupDesdeInicio)
$BackupHaciaCarpeta = IniRead($parametros, "rutas", "destino", "")
$BackupHaciaCarpetaAntesDeMapear = $BackupHaciaCarpeta
$Revisiones=0
;Contadores
$ErrorAlCopiar=0
$Actualizado=0
$SinModificar=0
$Nuevo=0
$Revisado=0
$folders=0
$DuracionCopia=0
;Pesajes
$PesoDelOrigen=0
$PesoDeArchivosCopiados=0
$PesoDeArchivosRevisados=0
$EspacioTotalEnDiscoDestino=0
$EspacioLibreEnDiscoDestino=0
$PorcentageEspacioLibreEnDiscoDestino=0
;Tiempos
$InicioCopiaEnTexto = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC
$InicioCopia = _NowCalc()
;Variables globales para enviar el mail.
;$oMyRet[2]
$oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
$EnviaMail = IniRead( $parametros, "mail", "enviamail", "" )
$Username = IniRead( $parametros, "mail", "username", "" )
$Password = IniRead( $parametros, "mail", "password", "" )
$SmtpServer = IniRead( $parametros, "mail", "smtp", "" )
$FromName = IniRead( $parametros, "mail", "from_name", "" )
$FromAddress = IniRead( $parametros, "mail", "from_address", "" )
$ToAddress = IniRead( $parametros, "mail", "to_address", "" )
$CcAddress = IniRead( $parametros, "mail", "cc_address", "" )
$BccAddress = IniRead( $parametros, "mail", "bcc_address", "" )
$IPPort = Int(IniRead( $parametros, "mail", "port", "" ))
$ssl = Int(IniRead( $parametros, "mail", "ssl", "" ))
$Importance = IniRead( $parametros, "mail", "importance", "" )
$Subject = IniRead( $parametros, "mail", "subject", "" )
$Body = IniRead( $parametros, "mail", "body", "" )
$AttachFiles = IniRead( $parametros, "mail", "attachfile", "" )
;Variables Globales para la compresion.
$ComprimoLaRevision = IniRead( $parametros, "compresion", "revisiones", "" )
$Revisiones = $CarpetaRevisiones & "\" & $InicioCopiaEnTexto
;MsgBox(0, "Donde revisiones", $CarpetaRevisiones)
;MsgBox(0, "Donde revision actual", $Revisiones)
;MsgBox(0, "Inicio copia", $InicioCopia)
;¿Es ruta UNC el origen ...?
$BackupDesdeInicio = SiEsRutaUNCMapeala( IniRead($parametros, "rutas", "unidad_mapeo_origen", ""), $BackupDesdeInicio, IniRead($parametros, "rutas", "usuario_origen", ""), IniRead($parametros, "rutas", "password_origen", "") )
;MsgBox(0, "$BackupDesdeInicio", $BackupDesdeInicio)
;¿Es ruta UNC el destino ...?
$BackupHaciaCarpeta = SiEsRutaUNCMapeala( IniRead($parametros, "rutas", "unidad_mapeo_destino", ""), $BackupHaciaCarpeta, IniRead($parametros, "rutas", "usuario_destino", ""), IniRead($parametros, "rutas", "password_destino", "") )
$CarpetaRevisiones = $BackupHaciaCarpeta & "\revisiones"
$BackupHaciaCarpeta = $BackupHaciaCarpeta & "\actual"
;Si no existe el directorio de Destino lo crea ...
If Not FileExists($BackupHaciaCarpeta) Then
DirCreate($BackupHaciaCarpeta)
EndIf
;Si no existe el directorio de las Revisiones lo crea ...
If Not FileExists($CarpetaRevisiones) Then
DirCreate($CarpetaRevisiones)
EndIf
;MsgBox(0, "$BackupHaciaCarpeta", $BackupHaciaCarpeta)
;MsgBox(0, "$CarpetaRevisiones", $CarpetaRevisiones)
;¿Es ruta UNC la carpeta de log ...?
$Logs = SiEsRutaUNCMapeala( IniRead($parametros, "rutas", "unidad_mapeo_log", ""), $Logs, IniRead($parametros, "rutas", "usuario_log", ""), IniRead($parametros, "rutas", "password_log", "") )
;Si no existe el directorio de los Logs lo crea ...
If Not FileExists($Logs & "\logs_completos\") Then
DirCreate($Logs & "\logs_completos\")
EndIf
;MsgBox(0, "$Logs", $Logs)
$ResumenDeLogCompleto = $InicioCopiaEnTexto & "_Resultado_de_la_copia.log"
$RutaDelArchivoDeLogCompleto = $Logs & "\Logs_completos\" & $ResumenDeLogCompleto
$ResumenDeLog = $Logs & "\" & $InicioCopiaEnTexto & " Resumen_de_la_copia.log"
;MsgBox(0, "Donde log", $ResumenDeLog)
;Pesa el origen
$PesoDelOrigen = DirGetSize($BackupDesdeInicio)
;SplashTextOn("Copia incremental", "", 800, 600, 100, 200, 4, "")
;##############
; Abre el Log
;##############
FileDelete($ResumenDeLog)
$filelog = FileOpen ($ResumenDeLog, 1)
FileWriteLine($filelog, @CRLF & @CRLF & "Copia Iniciada --> " & $InicioCopia & @CRLF & "Origen: " & $BackupDesdeInicioAntesDeMapear & @CRLF & "Destino: " & $BackupHaciaCarpetaAntesDeMapear)
CalculaPorcentageEspacioLibreEnDisco($BackupHaciaCarpeta)
;Comprueba que haya espacio en el disco destino;
CompruebaEspacioEnDiscoSiKOAborta($filelog, $ResumenDeLog)
;Ejecuta la funcion de copia incremental
InicioCopiaIncremental($BackupDesdeInicio, $Revisiones, $BackupHaciaCarpeta, $RutaDelArchivoDeLogCompleto, $Recursivo, $filelog, $ResumenDeLog)
;Establece el final OK de la copia ...
FinOkCopiaCierraLogEnviaMail($filelog, $ResumenDeLog)
ComprimeRevisiones($Revisiones, $CarpetaRevisiones, $InicioCopiaEnTexto)
;Salir del programa
EndFunc ;==>Backup
Func InicioCopiaIncremental($BackupDesde, $Revisiones, $BackupHaciaCarpeta, $RutaDelArchivoDeLogCompleto, $Recursivo, $filelog, $ResumenDeLog)
;MsgBox(0, "¿Donde estoy?", "Funcion InicioCopiaIncremental")
;_FileWriteLog($RutaDelArchivoDeLogCompleto, @CRLF & @CRLF & " A la carpeta.... " & $BackupHaciaCarpeta)
;FileChangeDir($BackupDesde)
$search = FileFindFirstFile($BackupDesde & "\*.*")
;Comprueba que exista el origen de los datos
;Si NO existe el origen de los datos ...
If ($search = -1) Then
;MsgBox(0, "$BackupDesde", $BackupDesde)
;MsgBox(0, "($search = -1)", ($search = -1))
;MsgBox(0, "($BackupDesde = $BackupDesdeInicio)", ($BackupDesde = $BackupDesdeInicio))
;MsgBox(0, "Error", "NO existe el origen de los datos ...")
_FileWriteLog($RutaDelArchivoDeLogCompleto, "Error al copiar ... El origen no contiene ningún archivo " & $BackupDesde)
;La copia se para porque no existe el origen de los datos.
;Establece el final de la copia ...
$FinCopia = _NowCalc()
;Finaliza el resumen del log
FileWriteLine($filelog, @CRLF & " LA COPIA NO SE HA REALIZADO PORQUE NO EXISTE EL ORIGEN DE LOS DATOS " & @CRLF & @CRLF)
FileWriteLine($filelog, "Copia finalizada --> " & $FinCopia)
;Cierra el Resumen de log.
FileClose($filelog)
;MsgBox(0, "", "Usuario: " & $Username & @CRLF & "Contraseña: " & $Password & @CRLF & "Servidor SMTP: " & $SmtpServer & @CRLF & "Remitente: " & $FromName & @CRLF & "Email de envio: " & $FromAddress & @CRLF & "Destinatario: " & $ToAddress & @CRLF & "Con copia: " & $CcAddress & @CRLF & "Con copia oculta: " & $BccAddress & @CRLF & "Puerto de salida: " & $IPPort & @CRLF & "Seguridad SSL: " & $ssl & @CRLF & "Importancia: " & $Importance & @CRLF & "Asunto: " & $Subject & @CRLF & "Cuerpo: " & $Body & @CRLF & "Adjunto: " & $AttachFiles)
;Envía el Resumen de log.
EnviaMail($ResumenDeLog)
;Salir del programa
;Exit 0
Else
;Si SI existe el origen de los datos ...
;MsgBox(0, "¿Origen de los datos?", $BackupDesde)
CopiaIncremental($BackupDesde, $Revisiones, $BackupHaciaCarpeta, $RutaDelArchivoDeLogCompleto, $Recursivo)
EndIf
EndFunc ;==> InicioCopiaIncremental
;Si SI existe el origen de los datos ...
Func CopiaIncremental($BackupDesde, $Revisiones, $BackupHaciaCarpeta, $RutaDelArchivoDeLogCompleto, $Recursivo)
;MsgBox(0, "¿Donde estoy?", "Funcion CopiaIncremental")
;MsgBox(0, "¿En que carpeta estoy?", $BackupDesde)
$search = FileFindFirstFile($BackupDesde & "\*.*")
;MsgBox(0,"$search", $search)
If ($search = -1) Then
;La carpeta SI está vacia, pero no es la carpeta raiz ...
;MsgBox(0, "Copia", "La carpeta SI está vacia, pero no es la carpeta raiz ...")
;MsgBox(0, "($search = -1)", ($search = -1))
;MsgBox(0, "($BackupDesde <> $BackupDesdeInicio)", ($BackupDesde <> $BackupDesdeInicio))
;MsgBox(0, "$BackupDesde", $BackupDesde)
;MsgBox(0, "$BackupDesdeInicio", $BackupDesdeInicio)
;Créala igualmente ...
DirCreate($BackupHaciaCarpeta)
Else
;MsgBox(0, "Copia", "La carpeta NO está vacia ...")
;La carpeta NO está vacia
While 1
$SiguienteArchivo = FileFindNextFile($search)
If @error Then ExitLoop
;MsgBox(0,"$search", $search)
;MsgBox(0,"Archivo", $SiguienteArchivo)
;MsgBox(0,"@error", @error)
;Comprueba si es un directorio
If FileGetAttrib($BackupDesde & "\" & $SiguienteArchivo) = "D" Then
;MsgBox(0,"","El archivo ->" & $SiguienteArchivo & "<- es una carpeta")
$folders = $folders + 1
if $Recursivo then CopiaIncremental($BackupDesde & "\" & $SiguienteArchivo, $Revisiones, $BackupHaciaCarpeta & "\" & $SiguienteArchivo, $RutaDelArchivoDeLogCompleto, $Recursivo)
Else
CopiaArchivos($BackupDesde & "\" & $SiguienteArchivo, $Revisiones, $BackupHaciaCarpeta, $BackupHaciaCarpeta & "\" & $SiguienteArchivo, 1, $RutaDelArchivoDeLogCompleto)
EndIf
WEnd
FileClose($search)
EndIf
EndFunc ;==> CopiaIncremental
;Funcion secundaria
Func CopiaArchivos($fromfile, $Revisiones, $tofolder, $tofile, $NuevaCopia, $RutaDelArchivoDeLogCompleto)
;MsgBox(0, "¿Donde estoy?", "Funcion CopiaArchivos")
$wFallo = ""
;Si el archivo NO existe en destino ...
If Not FileExists($tofile) Then
;MsgBox(0, "El archivo NO existe en destino", $tofile)
If $NuevaCopia Then
;Copia el archivo nuevo + control de error
If XCOPY($fromfile, $tofolder) <> 0 Then
_FileWriteLog($RutaDelArchivoDeLogCompleto, "Error al copiar ... " & FileGetShortName($fromfile) & "->" & FileGetShortName($tofile))
$ErrorAlCopiar = $ErrorAlCopiar + 1
$wFallo = " no copiado"
Else
;Regístralo
_FileWriteLog($RutaDelArchivoDeLogCompleto, "Nuevo ... " & FileGetShortName($fromfile) & "->" & FileGetShortName($tofile))
;Cuéntalo como copiado
$Nuevo = $Nuevo + 1
$PesoDeArchivosCopiados = $PesoDeArchivosCopiados + FileGetSize($tofile)
EndIf
EndIf
;Si el archivo SI existe en destino ...
Else
;MsgBox(0, "El archivo SI existe en destino", $tofile)
;CRC del origen ...
$fromCrc = FileGetAttrib($fromfile) & FileGetSize($fromfile) & FileGetTime($fromfile)
;CRC del destino ...
$toCrc = FileGetAttrib($tofile) & FileGetSize($tofile) & FileGetTime($tofile)
If $fromCrc <> $toCrc Then
;MsgBox(0, "El archivo en destino es distinto que en el origen", "")
;Compara los CRC, si son distintos se guarda una revisión y se actualiza
;Se guarda una revisión del archivo
;Se mira donde se guardará la revisión.
$RutaRelativaRevision = StringReplace($tofile,$BackupHaciaCarpeta,"")
;MsgBox(0, "", $RutaRelativaRevision)
$DondeRevision = $Revisiones & $RutaRelativaRevision
;MsgBox(0, "Revisamos el archivo en destino", $tofile & @CRLF & $DondeRevision)
;Paso 1 de 2, se revisa el archivo.
If XCOPY($tofile, DevuelveRuta($DondeRevision)) <> 0 Then
_FileWriteLog($RutaDelArchivoDeLogCompleto, "Error al revisar ... " & FileGetShortName($tofile) & "->" & FileGetShortName($DondeRevision))
$ErrorAlCopiar = $ErrorAlCopiar + 1
$wFallo = "<-no copiado"
Else
_FileWriteLog($RutaDelArchivoDeLogCompleto, "Revisado ... " & FileGetShortName($tofile) & "->" & FileGetShortName($DondeRevision))
$Revisado = $Revisado + 1
$PesoDeArchivosRevisados = $PesoDeArchivosRevisados + FileGetSize($DondeRevision)
EndIf
;Paso 2 de 2, se actualiza el archivo
If XCOPY($fromfile, $tofolder) <> 0 Then
_FileWriteLog($RutaDelArchivoDeLogCompleto, "Error al copiar ... " & FileGetShortName($fromfile) & "->" & FileGetShortName($tofile))
$ErrorAlCopiar = $ErrorAlCopiar + 1
$wFallo = "<-no copiado"
Else
_FileWriteLog($RutaDelArchivoDeLogCompleto, "Actualizado ... " & FileGetShortName($fromfile) & "->" & FileGetShortName($tofile))
$Actualizado = $Actualizado + 1
$PesoDeArchivosCopiados = $PesoDeArchivosCopiados + FileGetSize($tofile)
EndIf
;Compara los CRC, si son iguales no se modifica nada
Else
;MsgBox(0, "El archivo en origen es identico al que esta en destino ... sin modificar", "")
_FileWriteLog($RutaDelArchivoDeLogCompleto, "Sin modificar ... " & FileGetShortName($fromfile) & "->" & FileGetShortName($tofile))
$SinModificar = $SinModificar + 1
EndIf
EndIf
EndFunc ;==> CopiaArchivos
Func CalculaPorcentageEspacioLibreEnDisco($path)
;MsgBox(0, "¿Donde estoy?", "Funcion CalculaPorcentageEspacioLibreEnDisco")
$Unidad = StringLeft( $path, 3 )
;MsgBox( 0, "Unidad", $Unidad )
$EspacioLibreEnDiscoDestino = DriveSpaceFree( $Unidad )
$EspacioTotalEnDiscoDestino = DriveSpaceTotal( $Unidad )
$PorcentageEspacioLibreEnDiscoDestino = ( $EspacioLibreEnDiscoDestino * 100 ) / $EspacioTotalEnDiscoDestino
$PorcentageEspacioLibreEnDiscoDestino = Round( $PorcentageEspacioLibreEnDiscoDestino )
;MsgBox( 0, "Porcentaje de espacio libre en disco", $PorcentageEspacioLibreEnDiscoDestino )
EndFunc ;==> EspacioLibreEnDisco
;Comprueba que haya espacio en el disco destino.
Func CompruebaEspacioEnDiscoSiKOAborta($filelog, $ResumenDeLog)
;MsgBox(0, "¿Donde estoy?", "Funcion CompruebaEspacioEnDiscoSiKOAborta")
If $PorcentageEspacioLibreEnDiscoDestino < $UmbralEspacioLibreEnDisco Then
;MsgBox(0, "No hay capacidad en disco destino", $UmbralEspacioLibreEnDisco & @CRLF & $PorcentageEspacioLibreEnDiscoDestino)
;La copia se para por falta de espacio.
;Establece el final de la copia ...
$FinCopia = _NowCalc()
;Finaliza el resumen del log
FileWriteLine($filelog, @CRLF & " LA COPIA NO SE HA REALIZADO PORQUE NO HAY SUFICIENTE ESPACIO EN DISCO " & @CRLF & @CRLF)
FileWriteLine($filelog, "Copia finalizada --> " & $FinCopia)
;Cierra el Resumen de log.
FileClose($filelog)
;MsgBox(0, "", "Usuario: " & $Username & @CRLF & "Contraseña: " & $Password & @CRLF & "Servidor SMTP: " & $SmtpServer & @CRLF & "Remitente: " & $FromName & @CRLF & "Email de envio: " & $FromAddress & @CRLF & "Destinatario: " & $ToAddress & @CRLF & "Con copia: " & $CcAddress & @CRLF & "Con copia oculta: " & $BccAddress & @CRLF & "Puerto de salida: " & $IPPort & @CRLF & "Seguridad SSL: " & $ssl & @CRLF & "Importancia: " & $Importance & @CRLF & "Asunto: " & $Subject & @CRLF & "Cuerpo: " & $Body & @CRLF & "Adjunto: " & $AttachFiles)
;Envía el Resumen de log.
EnviaMail($ResumenDeLog)
;Salir del programa
;Exit 0
EndIf
EndFunc ;==> CompruebaEspacioEnDiscoSiKOAborta
;Establece el final OK de la copia ...
Func FinOkCopiaCierraLogEnviaMail($filelog, $ResumenDeLog)
;MsgBox(0, "¿Donde estoy?", "Funcion FinOkCopiaCierraLogEnviaMail")
$FinCopia = _NowCalc()
;MsgBox(0, "Fin copia", $FinCopia)
;Calcula la duración de la copia en segundos ...
$DuracionCopia = _DateDiff("s", $InicioCopia, $FinCopia)
;MsgBox(0, "Duración copia", $DuracionCopia)
;Finaliza el resumen del log
FileWriteLine($filelog, "Copia finalizada --> " & $FinCopia)
FileWriteLine($filelog, @CRLF & "Duracion de la copia ------------------------> " & $DuracionCopia & " segundos.")
$PesoDelOrigenEnMegaBytes = $PesoDelOrigen / 1024 / 1024
FileWriteLine($filelog, @CRLF & "Peso del origen -----------------------------> " & Round($PesoDelOrigenEnMegaBytes, 2) & " MegaBytes.")
$PesoDeArchivosCopiadosEnMegaBytes = $PesoDeArchivosCopiados / 1024 / 1024
FileWriteLine($filelog, "Peso de los archivos nuevos o actualizados --> " & Round($PesoDeArchivosCopiadosEnMegaBytes, 2) & " MegaBytes.")
$PorcentajeDeArchivosCopiados = ( $PesoDeArchivosCopiadosEnMegaBytes *100 ) / $PesoDelOrigenEnMegaBytes
FileWriteLine($filelog, "Porcentaje de archivos movidos a destino ----> " & Round($PorcentajeDeArchivosCopiados, 2) & " %.")
$PesoDeArchivosRevisadosEnMegaBytes = $PesoDeArchivosRevisados / 1024 / 1024
FileWriteLine($filelog, "Peso de los archivos revisados --------------> " & Round($PesoDeArchivosRevisadosEnMegaBytes, 2) & " MegaBytes.")
FileWriteLine($filelog, @CRLF & "Errores: " & $ErrorAlCopiar & @CRLF & "Actualizados: " & $Actualizado & " Revisados: " & $Revisado & @CRLF & "Sin Modificar: " & $SinModificar & @CRLF & "Nuevos: " & $Nuevo & @CRLF & @CRLF & " Total archivos: " & $ErrorAlCopiar + $Actualizado + $SinModificar + $Nuevo & @CRLF & " Total carpetas: " & $folders)
;Cierra el Resumen de log.
FileClose($filelog)
;Envía el Resumen de log.
;MsgBox(0, "", "Usuario: " & $Username & @CRLF & "Contraseña: " & $Password & @CRLF & "Servidor SMTP: " & $SmtpServer & @CRLF & "Remitente: " & $FromName & @CRLF & "Email de envio: " & $FromAddress & @CRLF & "Destinatario: " & $ToAddress & @CRLF & "Con copia: " & $CcAddress & @CRLF & "Con copia oculta: " & $BccAddress & @CRLF & "Puerto de salida: " & $IPPort & @CRLF & "Seguridad SSL: " & $ssl & @CRLF & "Importancia: " & $Importance & @CRLF & "Asunto: " & $Subject & @CRLF & "Cuerpo: " & $Body & @CRLF & "Adjunto: " & $AttachFiles)
EnviaMail($ResumenDeLog)
;Muestra el fichero de log
;Run("Notepad.exe " & $RutaDelArchivoDeLogCompleto)
;Esto no se lo que es
;WinWait($ResumenDeLogCompleto,"")
;If Not WinActive($ResumenDeLogCompleto,"") Then WinActivate($ResumenDeLogCompleto)
;WinWaitActive($ResumenDeLogCompleto,"",5)
;Send("{CTRLDOWN}{END}{CTRLUP}")
EndFunc ;==> FinOkCopiaCierraLogEnviaMail
; La funcion que envía el email
Func EnviaMail($ResumenDeLog)
;MsgBox(0, "¿Donde estoy?", "Funcion EnviaMail")
If $EnviaMail = 1 Then
$AttachFiles = $ResumenDeLog
;Comprobacion de los parámetros de envio de mail.
;MsgBox(0, "", "Usuario: " & $Username & @CRLF & "Contraseña: " & $Password & @CRLF & "Servidor SMTP: " & $SmtpServer & @CRLF & "Remitente: " & $FromName & @CRLF & "Email de envio: " & $FromAddress & @CRLF & "Destinatario: " & $ToAddress & @CRLF & "Con copia: " & $CcAddress & @CRLF & "Con copia oculta: " & $BccAddress & @CRLF & "Puerto de salida: " & $IPPort & @CRLF & "Seguridad SSL: " & $ssl & @CRLF & "Importancia: " & $Importance & @CRLF & "Asunto: " & $Subject & @CRLF & "Cuerpo: " & $Body & @CRLF & "Adjunto: " & $AttachFiles)
;Enviamos el mail
$rc = EnviandoMail($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
;Control de errores de envio de mail.
If @error Then
$filelog = FileOpen ($ResumenDeLog, 1)
FileWriteLine($filelog, @CRLF & "ERROR AL ENVIAR EL EMAIL" & @CRLF & "Codigo de error:" & @CRLF & @error & @CRLF & "Descripción:" & @CRLF & $rc)
FileClose($filelog)
EndIf
EndIf
EndFunc ;==>EnviaMail
Func EnviandoMail($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance = "Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
;MsgBox(0, "¿Donde estoy?", "Funcion EnviandoMail")
Local $objEmail = ObjCreate("CDO.Message")
$objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
$objEmail.To = $s_ToAddress
Local $i_Error = 0
Local $i_Error_desciption = ""
If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
$objEmail.Subject = $s_Subject
If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
$objEmail.HTMLBody = $as_Body
Else
$objEmail.Textbody = $as_Body & @CRLF
EndIf
If $AttachFiles <> "" Then
$objEmail.AddAttachment($AttachFiles)
Else
ConsoleWrite('No encuentro el archivo a adjuntar! ' & $AttachFiles & @LF)
SetError(1)
Return 0
EndIf
$objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
$objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
If Number($IPPort) = 0 Then $IPPort = 25
$objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
;SMTP con autentificación
If $s_Username <> "" Then
$objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
$objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
$objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
EndIf
;SSL
If $ssl Then
$objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
EndIf
;Actualiza configuración
$objEmail.Configuration.Fields.Update
;Estableze la importancia del emal
Switch $s_Importance
Case "High"
$objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "High"
Case "Normal"
$objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Normal"
Case "Low"
$objEmail.Fields.Item("urn:schemas:mailheader:Importance") = "Low"
EndSwitch
;Actualiza configuración
$objEmail.Fields.Update
;Envía el mensaje
$objEmail.Send
If @error Then
SetError(2)
Return $oMyRet[1]
EndIf
$objEmail = ""
EndFunc ;==>EnviandoMail
Func ComprimeRevisiones($Revisiones, $CarpetaRevisiones, $InicioCopiaEnTexto)
;MsgBox(0, "¿Donde estoy?", "Funcion ComprimeRevisiones")
If $ComprimoLaRevision=1 Then
ComprimeCarpeta($Revisiones, $CarpetaRevisiones, $InicioCopiaEnTexto)
EndIf
EndFunc
Func ComprimeCarpeta($CarpetaAComprimir, $CarpetaDestinoDeLaCompresion, $NombreDelArchivoComprimido)
;MsgBox(0, "¿Donde estoy?", "Funcion ComprimeCarpeta")
If FileGetAttrib($CarpetaAComprimir) = "D" Then
;MsgBox(0, "¿Donde estoy?", "Comprimiendo " & $Revisiones)
$OrigenDeLaCompresion = $CarpetaAComprimir & "\*.*"
$DestinoDeLaCompresion = $CarpetaDestinoDeLaCompresion & "\" & $NombreDelArchivoComprimido & ".zip"
$DondeEstaElPrograma = '7-zip\'
$ComandoDeCompresion = $DondeEstaElPrograma & '7za.exe a -r "' & $DestinoDeLaCompresion & '" "' & $OrigenDeLaCompresion & '"'
$PIDResultadoCompresion = Run($ComandoDeCompresion, @ScriptDir, @SW_HIDE)
;$rc = RunWait(@ComSpec & " /c notepad.exe", "", @SW_HIDE)
;MsgBox(0, "¿A comprimido? PID <> 0 SI a comprimido : ", $PIDResultadoCompresion)
If $PIDResultadoCompresion <> 0 Then
DirRemove($CarpetaAComprimir, 1)
EndIf
EndIf
EndFunc
; Control de errores en el envío del mensaje.
Func MyErrFunc()
;$HexNumber = Hex($oMyError.number, 8)
;$oMyRet[0] = $HexNumber
;$oMyRet[1] = StringStripWS($oMyError.description, 3)
;ConsoleWrite("### Error en el envío del mensaje ! Número: " & $HexNumber & " Linea del script: " & $oMyError.scriptline & " Descripción: " & $oMyRet[1] & @LF)
;SetError(1)
Return
EndFunc ;==>MyErrFunc
Func XCOPY($OrigenXCOPY, $DestinoXCOPY)
#cs
XCOPY es una orden proveniente del sistema operativo DOS, pero esta también disponible en Windows. XCOPY significa copia externa y fue originalmente usado para copiar múltiples archivos desde un directorio a otro, luego también usado para copiar archivos a través de una red.
XCOPY puede ser usado para copiar un disco entero usándolo con todos los parámetros siguientes:
xcopy <<dispositivo origen>>:\*.* <<dispositivo destino>>:\ /h /i /c /k /e /r /y /v
Otras opciones útiles del comando xcopy,
* /H Copia archivos ocultos y también archivos del sistema.
* /I Si el destino no existe y hay que copiar más de un archivo, se asume que el destino debe ser un directorio.
* /C Continua copiando incluso si ocurren errores.
* /K Copia atributos. Xcopy normal, restablecerá atributos de sólo lectura.
* /S Copia directorios y subdirectorios ,exceptuando los vacíos.
* /E Copia directorios y subdirectorios, incluyendo los vacíos.
* /R Sobrescribe archivos de sólo-lectura.
* /Y Suprime la pregunta de confirmación para suprimir un archivo de destino existente.
* /F Muestra todo el origen y el destino de los nombres de archivo mientras se copian.
* /D:m-d-y Copia archivos cambiados durante o después de la fecha. Si no se da una fecha, copia sólo aquellos archivos cuya fecha de origen es más nueva que la fecha de destino.
* /V Verifica el tamaño de cada archivo nuevo.
* /? Para Más Información - Ayuda.12
Para más opciones, ejecuta xcopy/? en el símbolo del sistema.
#ce
$ParametrosDeXCOPY = "/h /i /c /k /e /r /y /v"
$OrigenXCOPY = '"' & $OrigenXCOPY & '"'
$DestinoXCOPY = '"' & $DestinoXCOPY & '\"'
#cs
XCOPY puede ser usado para copiar un disco entero usándolo con todos los parámetros siguientes:
xcopy <<dispositivo origen>>:\*.* <<dispositivo destino>>:\ /h /i /c /k /e /r /y /v
xcopy "D:\Datos de Usuario\Escritorio\Copia Incremental con AutoIt\origen\*.*" "D:\Datos de Usuario\Escritorio\Copia Incremental con AutoIt\destino\" /h /i /c /k /e /r /y /v
#ce
$ComandoXCOPY = "xcopy " & $OrigenXCOPY & " " & $DestinoXCOPY & " " & $ParametrosDeXCOPY
#cs
$PID = RunWait(@ComSpec & " /c " & "commandName" , @ScriptDir, @SW_HIDE)
#ce
;MsgBox(0, "Comando XCOPY", $ComandoXCOPY )
$PID_XCOPY = RunWait(@ComSpec & " /c " & $ComandoXCOPY , @ScriptDir, @SW_HIDE)
;MsgBox(0, "PID Comando XCOPY", $PID_XCOPY)
Return $PID_XCOPY
EndFunc
Func DevuelveRuta($string)
While 1
;MsgBox(0, "Cadena de texto", $string)
$len = StringLen($string)
;MsgBox(0, "Numero de caracteres", $len)
$caracter = StringMid($string, $len, 1)
;MsgBox(0, "Caracter que quito", $caracter)
If $caracter = "\" Then Return StringMid($string, 1, $len-1)
$string = StringMid($string, 1, $len-1)
WEnd
EndFunc
Func EsRutaUNC($Ruta)
;MsgBox(0, "Ruta", $Ruta)
If StringLeft($Ruta, 2) = "\\" Then
;MsgBox(0, "", "SI es UNC")
Return 1
Else
;MsgBox(0, "", "No es UNC")
Return 0
EndIf
EndFunc
Func SiEsRutaUNCMapeala($LaLetraMParaMapeo, $RutaAMirar, $ElUsuario, $ElPassword)
If EsRutaUNC($RutaAMirar) Then
$rs = DriveMapAdd($LaLetraMParaMapeo, $RutaAMirar, 0, $ElUsuario, $ElPassword)
;MsgBox(0, "¿A mapeado bien?", $rs)
Return $LaLetraMParaMapeo
Else
Return $RutaAMirar
EndIf
EndFunc