Backup incremental
Publicado: 15 Mar 2011, 21:58
Bueno pues es mi primer post el foro y mi primer código más o menos serio.
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
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