[Batch][Tutorial] Crear respaldos de lote de archivos.

Iniciado por areyes, 4 Septiembre 2019, 18:38 PM

0 Miembros y 1 Visitante están viendo este tema.

areyes

Estimados,

Gracias por el manual que tienen de Batch, a cambio del valioso instructivo que proporcionan, dejo aquí lo que cree.

A grandes rasgos esto realiza una copia de seguridad de archivos que están dentro de una carpeta y que comienzan con un nombre en particular, la fecha de los archivos debe venir en el nombre del archivo que se revisan.
Se crearan dos carpetas donde se colocarán los archivos, Carga y Respaldos. La carpeta Carga servirá para que otro proceso tome solo ese archivo para su procesamiento.

Cualquier duda les responderé.

Saludos.

Código (dos) [Seleccionar]

rem echo ################
rem echo # Creado Por   #
rem echo # Alexis Reyes #
rem echo # s00a-areyes  #
rem echo ################

rem Archivos a revisar:
rem archivo_20190401.txt
rem archivo_20190403.txt
rem archivo_20190408.txt
rem archivo_20190420.txt

rem Despues de ejecutar el batch se crea la siguiente estructura de archivos y carpetas:

rem CARGA
rem - NOMBRE_NUEVO.TXT
rem RESPALDOS
rem - 01-04-2019
rem - NOMBRE_NUEVO.TXT
rem - 03-04-2019
rem - NOMBRE_NUEVO.TXT
rem - 08-04-2019
rem - NOMBRE_NUEVO.TXT
rem - 20-04-2019
rem - NOMBRE_NUEVO.TXT

rem Se debe considerar los siguientes parametros:
rem carpetaCarga: Es la ruta donde se colocará el archivo mas actual, que luego otro proceso tomará.
rem carpetaRespaldo: Es la carpeta donde se crearan las carpetas por día.
rem nombreArchivo: Es el nombre que tendrán todos los archivos que se revisarán luego del proceso de normalizacion de nombres.
rem subCadenaInicio: Es la cadena que se revisará en los nombres de archivos que se quieran revisar. Ej: Archivo_20190401.txt -> Archivo_
rem vNumero: Es el numero de fecha extraida del nombre que son buscados Ej: Archivo_20190401.txt -> 20190401
@echo off
set dirActual=%cd%
rem echo %dirActual%
SET subCadenaInicio=Archivo_
rem Establecer el nombre de la carpeta en donde estará la última carga
SET carpetaCarga=CARGA
rem Establecer el nombre de la carpeta en donde estarán los respaldos de los archivos
SET carpetaRespaldo=RESPALDOS
rem Establecer el nombre de salida que tendrán todos los archivos
SET nombreArchivo=NOMBRE_NUEVO.TXT
rem Establecer variable del día más actual
SET vDiaMasActual=0
rem Etiqueta en donde se iniciará el programa
GOTO:INICIO
rem Funcion que verifica que si una carpeta existe, sino la crea.
rem Recibe 2 parametros: La carpeta que se quiere saber si existe y el nombre de la etiqueta de dónde irá el código luego de terminar la funcion.
:ExistenciaCarpeta
IF exist %1 (
rem echo %1 exists
) ELSE (
mkdir %1
rem echo %1 created
)
GOTO:%2
rem Funcion que verifica que si una archivo existe, sino lo crea vacio. Luego realiza una copia.
rem Recibe 3 parametros: El archivo, el archivo que se quiere copiar  y dónde irá el código luego de terminar la funcion.
:ExistenciaArchivo
IF exist %1 (
del /f/s/q %1
) ELSE (
echo "" > %1
)
COPY %2 %1
GOTO:%3
rem Inicio del programa
:INICIO
Call:ExistenciaCarpeta %carpetaRespaldo% %carpetaRespaldo%
:RESPALDOS
Call:ExistenciaCarpeta %carpetaCarga% %carpetaCarga%
:CARGA
rem Inicia el ciclo para revisar los archivos que se quieren revisar
goto:ciclo
:cont
rem echo %1
SET linea=%1
SET vNumero=%linea:~4,8%
SET vCarpetaNueva=RESPALDOS\%linea:~10,2%-%linea:~8,2%-%linea:~4,4%
rem ECHO Nombre Fecha: %vCarpetaNueva%
rem ECHO %vNumero% %vDiaMasActual%
Call:ExistenciaCarpeta %vCarpetaNueva% CarpetaNueva
:CarpetaNueva
rem Se verifica que la fecha del archivo que se está revisando es mayor al dia que se ha guardado como más actual, si es así se reemplaza el valor.
IF %vNumero% GTR %vDiaMasActual% (
SET vDiaMasActual=%vNumero%
Call:ExistenciaArchivo %carpetaCarga%\%nombreArchivo% %linea% ArchivoLinea1
)
:ArchivoLinea1
Call:ExistenciaArchivo %vCarpetaNueva%\%nombreArchivo% %linea% ArchivoLinea2
:ArchivoLinea2
del /f/s/q %linea%
rem ECHO DIA MAS ACTUAL: %vDiaMasActual%
rem Se revisan todos los archivos que se encuentran dentro de la carpeta que se ejecuta el batch y que comienzan con la subCadenaInicio
:ciclo
FOR %%x in (%subCadenaInicio%*) DO (
call :cont %%x
)
exit