Si has tenido que recuperar datos de tus copias de seguridad y has visto que tampoco servían lee esto para mejorar tu sistema. Aquí te voy a enseñar un método para mantener nuestros datos de seguridad realmente seguros.
A todos nos ha pasado que hemos perdido datos en alguna ocasión. Bien porque se nos ha estropeado un disco duro o porque un fichero estaba corrupto y habíamos hecho copia de seguridad del mismo, encontrándonos que, a pesar de que lo restauremos, la copia también estaba corrupta. Al final la situación es la misma: hemos pedido nuestros datos.
Métodos para respaldar nuestros datos
Yo me convertí ya hace tiempo en un maniático de las copias de seguridad. Hago copia todos los días y, además, en discos alternos. Aun así, esto no me ha librado de algún pequeño desastre. Si hay ficheros que se han corrompido, pero no los abres en varios días, al final acabarás, como yo, con varias copias de seguridad de dichos archivos… pero para nuestra desesperación, también corruptas.
Yo he resuelto esto mediante un pequeño script de AutoIt para que, además de la copia de seguridad «normal», es decir, misma ruta, mismo nombre de archivo, para aquellos datos realmente importantes y cuya pérdida puede causar una pequeña catástrofe, me haga una copia en un directorio que se va renombrando de forma automática con el formato NombreOriginal & YYYYMMDD, es decir año, mes y día de la copia. De esa forma, tengo varias copias, de varios días, a las que me puedo remontar para encontrar una del fichero no corrupto. Perderé algunos días de datos, pero no el fichero completo.
Obviamente, esto no se puede aplicar a todos los datos de tus discos duros salvo que tengas en casa una granja de servidores con espacio ilimitado. Por eso, hay que ser un poco selectivo sobre a que datos aplicar este método. Además, tendrás que, periódicamente, ir haciendo limpieza y borrar las copias mas antiguas, dejando disponibles el número de ellas que consideres adecuado, por el tamaño que ocupan en su conjunto y que preserve la seguridad de tus datos.
Fichero de ayuda de AutoIt
Como ya comenté en la entrada Programando scripts con AutoIt. Mi primer script (I), AutoIt dispone de un fantástico fichero de ayuda. Sería muy recomendable que, según vamos avanzando en la programación de este script, te apoyes en dicha ayuda para ampliar tus conocimientos.
Estructura del script AutoIt
La estructura de script para mantener nuestros datos de seguridad realmente seguros es muy sencilla:
- indicaremos la ruta origen de los datos a copiar
- indicaremos la ruta base destino donde copiar dichos datos
- crearemos de forma automática el sufijo a agregar a la ruta base, basado en la fecha actual del sistema
- realizaremos la copia de seguridad
- además, como la realización de la copia puede llevar unos minutos, añadiremos un ventana de información de que se está realizando la copia y un mensaje final de confirmación del final del proceso
Creación del mensaje para el usuario
Lo primero que haremos será crear el mensaje que se visualizará para informar al usuario de que se están copiando los datos. Para ello, tendremos que crear un GUI (graphic user interface), y lo haremos medinate la instrucción $Form=GUICreate(«Copiando datos», 300,80).

Lo que le estamos diciendo es que:
- Queremos crear un GUI (GUICreate
- Lo queremos referenciar, en isntrucciones posteriores, mediante la variable $Form
- Queremos que su título sea «Copiando datos»
- Y que sus dimensiones sean 310 px de ancho y 80 de alto
Para poder insertar un GUI en nuestro script, tendremos que añadir a nuestro proyecto la libreria <GUIConstantsEx.au3>, lo que haremos con la instrucción #include <GUIConstantsEx.au3> al principio del script.
Vamos a hacer que sea de color cyan, mas o menos. Necesitaremos añadir la instrucción GUISetBkColor(0x6CD8EC) donde, como ves, el color se indica en formato RGB hexadecimal.

Y vamos a hacer que esta ventana informativa, se muestre, mas o menos, en el centro de la pantalla. Añadiremos la instrucción WinMove($Form, «», 600, 400). Como ves, usamos la variable $Form para que la instrucción sepa a que GUI nos estamos refiriendo.

Podríamos hacer un centrado mas preciso e, incluso, adaptable al tamaño de visualización de la pantalla que estemos usando en este momento. Para ello, solo tendríamos que obtener las medidas de dicha pantalla y hacer los cálculos correspondientes. Pero esta tarea te la dejo como deberes si la quieres implementar.
Mensaje para el usuario
De momento, hemos creado «la cajita contenedora del mensaje», pero no el mensaje en si. Para ello, deberemos indicar que, dentro del GUI ventana, queremos añadir un campo de texto. Eso se hace con la instrucción GUICtrlCreateLabel a la que le deberemos indicar una serie de parámetros.

Yo he puesto lo siguiente:
GUICtrlCreateLabel(«Estoy haciendo copia de seguridad de los datos importantes.» & chr(13) & «Esto puede llevar un ratito.»,10,10,280,70,$SS_CENTER)
En primer lugar, le indico el texto que quiero que se muestre. Como ves, concateno dos cadenas con el operador & y entre ellas inserto un salto de linea con el carácter chr(13).
Los siguientes parámetros indican:
- Posición izquierda, dentro del GUI: 10
- Posición arriba, dentro del GUI: 10
- Anchura del campo etiqueta: 280, es decir, dejo 10 de margen también a la derecha ya que el GUI es de 300
- Altura del campo etiqueta: 70. Esta vez no dejo margen inferior
- Le indico que quiero que el texto se muestre centrado: $SS_CENTER
El uso de la constante $SS_CENTER requiere que añadamos la referencia #include <StaticConstants.au3>
Además, me gustaría que el texto se aprecie bien y resalte, así que le voy a indicar que lo muestre en negrita. Añado a continuación la instrucción GUICtrlSetFont (-1,12, 700) que lleva los siguientes parámetros:

- Indicación de a que control nos referimos. En este caso, como la instrucción va justo a continuación de la de creación de la etiqueta, basta con indicar -1 para que entienda que nos referimos al último control creado. Si fuésemos a crear varios controles y después asignarles características, la instrucción de creación debería ser como la del GUI primero, es decir, deberíamos asignarlo a una variable mediante la cual podríamos hacer referencia al mismo posteriormente.
- Tamaño de fuente:
- Peso de la fuente: 700 que corresponde a Bold. Podríamos también haber usado la variable específica $FW_BOLD, en cuyo caso, deberíamos agregar al proyecto la librería <FontConstants.eu3> mediante la correspondiente orden #include.
Mostrar el GUI
Hasta ahora, lo que hemos hecho es crear el GUI contenedor y los controles que queremos dentro del mismo. Ahora hay que hacerlo visible, para lo que necesitaremos añadir la instrucción GUISetState(@SW_SHOW). Solo necesitamos indicar que queremos mostrarlo, sin necsidad de indicar que GUI ya que solo tenemos uno. Si hubiesemos creado varios, deberíamos especificar cual queremos mostrar para lo que añadriríamos el parámetro con el manejador del GUI, es decir, GUISetState(@SW_SHOW,$Form).

Con lo hecho hasta ahora, podemos ejecutarlo para ver que nos mostraría como aviso. Ten en cuenta que, como el script se acaba nada mas mostrar el GUI, no te va a dar tiempo a verlo. Añade una instrucción Sleep(3000) al final para que se vea durante 3 segundos antes de terminar el script.
include <GUIConstantsEx.au3>
include <StaticConstants.au3>
$Form=GUICreate(«Copiando datos», 310,80)
GUISetBkColor(0x6CD8EC)
WinMove($Form, «», 600, 400)
GUICtrlCreateLabel(«Estoy haciendo copia de seguridad de los datos de MisGastos.» & chr(13) & «Esto puede llevar un ratito.»,10,10,280,70,$SS_CENTER)
GUICtrlSetFont (-1,12, 700)
GUISetState(@SW_SHOW,$Form)
sleep(3000)
Y el resultado es este:

Claro, que de momento, es mentira. No está copiando nada. Solo nos muestra esta ventana.
Copia de datos
Ahora ya si que nos vamos a meter en la parte importante del script, que es copiar la información necesaria para mantener nuestros datos de seguridad realmente seguros.
En este caso vamos a hacer copia de un directorio con todas sus subcarpetas y ficheros.
Ruta origen
Lógicamente, deberemos informar a nuestro script de cuales son los datos de los que queremos hacer la copia de seguridad. Para ello, cargaremos la ruta completa en una variable. Podríamos indicar esta ruta directamente en la orden de copia, pero de esta forma el script es mucho mas legible y entendible.
$RutaOrigen=»D:\Financiero\EstadoContable»
Definimos una variable, que se llama $RutaOrigen, de forma que queda claro que almacenamos en ella.
Ruta destino
Ahora definiremos en otra variable la ruta de destino. Esta no es fija, sino que, como hemos comentado, debe ser dinámica en función de la fecha de la copia por lo que necesitaremos tomar la hora del sistema y generar esta ruta.
Lo haremos con el siguiente par de instrucciones:
$FechaCopia=StringMid(_NowDate(),7,4)&StringMid(_NowDate(),4,2)&StringMid(_NowDate(),1,2)
Lo primero que hacemos es crear una variable donde almacenaremos el sufijo a añadir. Decíamos que sería la fecha actual en el formato YYYYMMDD donde YYYY es el año con 4 dígitos, MM el mes con 2 dígitos y DD el día con 2 dígitos. Esto lo logramos de obtener la fecha del sistema con la instrucción _NowDate()

que nos devuelve la fecha del sistema en el formato que maneje el mismo (en mi caso, es DD/MM/YYYY) y manipular la cadena devuelta para extraer cada dato que necesitamos (DD, MM, YYYY) y concatenar dichas subcadenas extraídas con el operador &.
La extracción de cada subcadena la hacemos con la instrucción StringMid.

Si en tu casp el formato de fecha del sistema es MM/DD/YYYY, deberás retocar el orden de ordenación de la cadena.
Obtenido el sufijo, solo nos falta crear una variable donde se almacene la ruta completa de destino concatenando la ruta base con el sufijo creado:
$RutaDestino=»G:\Financiero\EstadoContable\» & $FechaCopia
Presta atención al carácter \ que he añadido al final de la ruta base. De no incluirlo, estaríamos creando la cadena G:\Financiero\EstadoContable20200522 en vez de la correcta G:\Financiero\EstadoContable\20200522
Proceso de copia
La copia la realizaremos con la instrucción DirCopy

Como ves, los parámetros de la instrucción son la ruta del directorio origen, la ruta del directorio destino y un «flag». Este flag especifica si queremos o no sobreescribir datos en caso de que ya existan en el destino. En nuestro caso, vamos a sobreescribir, por si hacemos el proceso varias veces en un mismo día, asegurarnos de que tenemos la última actualización. Tu puedes elegir la opción que mas te convenga e , incluso, modificar el sufijo de la ruta para que incluya además hora y minuto si es que lo necesitases. Te dejo también la tarea de hacer esto para ti. Con apoyo de la ayuda de AutoIt, y si hasta aquí has entendido lo que vamos haciendo, seguro que no tienes ningún problema.
La instrucción será, por tanto: DirCopy($RutaOrigen,$RutaDestino,$FC_OVERWRITE).
Como estamos usando el nombre de la variable $FC_OVERWRITE, deberemos hacer el correspondiente #include <FileConstants.au3>. Si queremos ahorrarnos esto, tendremos que poner la instrucción como DirCopy($RutaOrigen,$RutaDestino,1).
Finalmente, esta parte del código nos quedará como sigue:
;*************************** COPIAR DATOS a G ********************
$RutaOrigen=»D:\Financiero\EstadoContable»
$FechaCopia=StringMid(_NowDate(),7,4)&StringMid(_NowDate(),4,2)&StringMid(_NowDate(),1,2)
$RutaDestino=»G:\Financiero\EstadoContable\» & $FechaCopia
DirCopy($RutaOrigen,$RutaDestino,$FC_OVERWRITE)
Fíjate en el párrafo de código anterior. La primera linea es un comentario. La identificación de linea para indicar que es un comentario y que, por tanto, lo que sigue debe ser ignorado durante la ejecución se hace con un ; (punto y coma).
Fin del proceso. Informar y salir
Para finalizar, informaremos mediante un MsgBox de que se han copiado los datos. Previamente, ocultaremos el GUI que hemos mostrado durante el proceso de copia. El código a usar es el siguiente:
$Mensaje= «Copia de seguridad realizada en » & $RutaDestino
GUISetState(@SW_HIDE,$Form)
MsgBox($MB_SYSTEMMODAL,»Fin»,$Mensaje)
En la primera línea, tan solo ponemos el texto que después mostraremos en una variable. Es una forma de que el código sea mas legible cuando queramos seguir lo que hace, sobre todo, so quien lo va a mirar no es quien lo ha escrito. Se podría poner directamente como parámetro del MsgBox, pero no es la mejor práctica.
Para ocultar el GUI, ves que se usa de nuevo la instrucción GUISetState a la que en esta ocasión se le pasa el parámetro para ocultar dicho GUI (@SW_HIDE) y el manejador de la ventana del GUI ($Form), de forma que quede perfectamente identificado que ventana queremos ocultar.
Script completo
El código completo del script nos quedaría como puedes ver a continuación:
# include <GUIConstantsEx.au3>
# include <StaticConstants.au3>
$Form=GUICreate(«Copiando datos», 310,80)
GUISetBkColor(0x6CD8EC)
WinMove($Form, «», 600, 400)
GUICtrlCreateLabel(«Estoy haciendo copia de seguridad de los datos importantes.» & chr(13) & «Esto puede llevar un ratito.»,10,10,280,70,$SS_CENTER)
GUICtrlSetFont (-1,12, 700)
GUISetState(@SW_SHOW,$Form)
;*********************** COPIAR DATOS a G ************************
$RutaOrigen=»D:\Financiero\EstadoContable»
$FechaCopia=StringMid(_NowDate(),7,4)&StringMid(_NowDate(),4,2)&StringMid(_NowDate(),1,2)
$RutaDestino=»G:\Financiero\EstadoContable\» & $FechaCopia
DirCopy($RutaOrigen,$RutaDestino,$FC_OVERWRITE)
;******************* FIN PROCESO COPIA *********************
$Mensaje= «Copia de seguridad realidas en » & $RutaDestino
GUISetState(@SW_HIDE,$Form)
MsgBox($MB_SYSTEMMODAL,»Fin»,$Mensaje)
Compilar el script
Una vez que hemos terminado de escribir el script y lo hemos probado ejecutándolo desde el editor SciTE con F5, el siguiente paso será compilarlo para así poder tener el ejecutable correspodiente que poder lanzar solo con hacer doble click en él.
Puedes ver el procedimiento para realizar esta compilación en Programando scripts con AutoIt. Mi primer script (II).
En el artículo Mejorar la productividad con AutoHotkey también puedes ver una forma sencilla de asignar una combinación de teclas a la ejecución del exe creado, de forma que sea aun mas rápida su ejecución.
Conclusión
Como has podido ver, hemos hecho un script muy sencillo, con unas pocas líneas de código, pero que nos puede resolver un problema bastante importante como es mantener nuestros datos de seguridad realmente seguros. Si combinamos esto además con un enlace rápido hecho con AutoHotkey, tendremos una forma rapidísima y sencilla de ejecutar un proceso de salvaguarda de nuestros datos de seguridad.
Si quieres aprender mas sobre AutoIt, puedes visitar la página home de Autoit.