Backup incremental

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Salva
Mensajes: 3
Registrado: 15 Mar 2011, 21:31

Backup incremental

Mensaje por Salva »

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

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
	
	

Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Backup incremental

Mensaje por BasicOs »

Gracias por el aporte, :smt041 :smt041 :smt041 :smt041
si deseas incluir un zip con el fuente, el ini y el ejecutable lo puedes hacer en adjuntar, por si alguien quiere darle caña directamente. :smt042
Salu22:)
Salva
Mensajes: 3
Registrado: 15 Mar 2011, 21:31

Re: Backup incremental

Mensaje por Salva »

Envio el zip con todo.
Adjuntos
CopiaIncremental.zip
(786.41 KiB) Descargado 235 veces
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Backup incremental

Mensaje por Chefito »

Parece interesante el programa. Enhorabuena por tu primer código :smt023 .

Al ser un script sin gui amigable y algo menos intuitivo, te recomiendo que pongas una pequeña explicación de los parámetros que debes poner en el .ini. Y si pones un ejemplo explicado mucho mejor :smt002 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Salva
Mensajes: 3
Registrado: 15 Mar 2011, 21:31

Re: Backup incremental

Mensaje por Salva »

Subo código mejorado respecto al anterior.
Respecto al lo del ConfiguracionCopia.ini la explicación es la siguiente:

[rutas]
umbral_espacio_libre_en_disco=20 <----------- Si el espacio libre en disco donde se guardará la copia es inferior al 20% la copia no se hara y se informará por correo.
origen=\\192.168.7.2\Datos\Scripts <-----------Donde están los datos a copiar.
usuario_origen= <-----------Si la ruta del origen de los datos es una ruta UNC y precisa de autentificación aquí se escribiría el DOMINIO\usuario, si no procede se deja vacio.
password_origen= <-----------Si la ruta del origen de los datos es una ruta UNC y precisa de autentificación aquí se escribiría el password, si no procede se deja vacio.
destino=\\192.168.7.2\Datos\Copia de Scripts <-----------Donde va a parar la copia de los datos.
usuario_destino= <-----------Si la ruta destino de los datos es una ruta UNC y precisa de autentificación aquí se escribiría el DOMINIO\usuario, si no procede se deja vacio.
password_destino= <-----------Si la ruta destino de los datos es una ruta UNC y precisa de autentificación aquí se escribiría el password, si no procede se deja vacio.
log=N:\Escritorio\Logs <-----------Donde van a parar los .log
usuario_log= <-----------Si la ruta del log de la copia es una ruta UNC y precisa de autentificación aquí se escribiría el DOMINIO\usuario, si no procede se deja vacio.
password_log= <-----------Si la ruta del log de la copia es una ruta UNC y precisa de autentificación aquí se escribiría el password, si no procede se deja vacio.
[mail]
enviamail=1 <----------- Si queremos que nos envie un mail con el resultado de la copia, ponemos 1, sino 0.
username=UsuarioCorreo <-----------Usuario para autentificarnos contra el servidor SMTP, si este precisa de autentificación.
password=PasswordCorreo <-----------Password para autentificarnos contra el servidor SMTP, si este precisa de autentificación.
smtp=smtp.midominio.com <-----------El servidor SMTP.
from_name=MiNombre <-----------Quien envía el correo.
from_address=[email protected] <-----------Desde que dirección de mail se envía.
to_address=[email protected] <-----------A que buzón se envía.
cc_address= <-----------Con copia.
bcc_address= <-----------Con copia oculta (no estoy seguro).
port=25 <-----------Puerto del servidor SMTP.
ssl=0 <-----------Si el SMTP necesita SSL ponemos 1 sino 0.
importance=Norma l<-----------Pues no tengo mucha idea, hay tres niveles y está en el normal.
subject=Resultado de la copia <-----------El asunto del mail.
body=Resultado de la copia <-----------El cuerpo del mensaje.
attachfile= <----------Aquí no pongo nada, porque el adjunto es un archivo .log con el resultado de la copia, con lo que en este caso particular da igual lo que se ponga porque el código lo va a ignorar.
[planificacion]
programacion_cron= */1 * * * * <-----------Como el crontab de linux. Minutos(0-59) horas(0-23) dia mes(1-31) mes(1-12) dia semana(0-7) 0=domingo
[revisiones]
revisar=1 <-----------Si el archivo que queremos copiar ya existe destino, pero cambia en tamaño, fecha de modificación o en sus atributos, primero se copia del destino a una carpeta cuyo nombre es la fecha actual, para que después el archivo del origen machaque al de destino.Para todo esto ponemos un 1 sino un 0
compresion=1 <-----------Si queremos que después de hacernos la revisión descrita anteriormente nos comprima el resultado total ponemos un 1 sino un 0.


Una cosa que quedaría bien es que después de hacer la copia se purgara de revisiones obsoletas, es decir que se le pusiera un límite de revisiones a guardar, por antiguedad o por número de estas para que no crecieran de forma descontrolada.
Yo lo tengo instalado como un servicio (Resource Tool Kit --> svrany.exe) marchando con la cuenta SYSTEM en un XP y va bastante bién.

Un saludo.
Adjuntos
CopiaIncremental.rar
Codigo mejorado respecto al anterior adjunto
(743.49 KiB) Descargado 237 veces
vicodex
Mensajes: 7
Registrado: 24 Mar 2011, 05:50

Re: Backup incremental

Mensaje por vicodex »

Ummm interesante para ser tu primer script companero,.

PD: Podrias anadirle una GUI donde el cual cargando el .ini lea los parametros e inicie dicha copia de seguridad o si mas bien,podrias crer dicha GUI y hacer que tengas la funcion de crear dicha copia en algun otro lugar del computador y que no solo nos notifique por mail sino por un archivo .txt con X nombre y ponerlo si deseas en el escritorio o en cualquier otra ruta.

Aun asi se agradece tu aporte,.Saludos!
:smt039
Responder