[BATCH] Script para backups incrementales.

Iniciado por jorma16, 31 Julio 2012, 12:21 PM

0 Miembros y 3 Visitantes están viendo este tema.

jorma16

Hola, estoy haciendo un proyecto para mi lugar de trabajo, consiste en hacer un Script que me haga copias de seguridad de las carpetas del servidor donde guardan los usuarios toda su información, como podréis imaginar, la cantidad de información es enorme. y lo queremos hacer de la siguiente forma, a ver si me explico.


  • La primera vez que ejecutemos el Script me generara un .7z por cada usuario del servidor y un .txt con la siguiente información y dispuesta de la siguiente manera "nombreArchivo FechaModAAAAMMDD Backup. Es decir, si la carpeta es PEPE, me generará un PEPE.7z y un PEPE.txt con la siguiente informacion, "hola.txt 20120731 0"


  • La segunda vez que se ejecute el Script, lo que tiene que hacer es, generar un .txt con la lista de los archivos en el mismo formato que el anterior, y comparar cpn PEPE.txt, los archivos nuevos serán incluidos en un nuevo .7z llamado en el caso anterior PEPE_1.7z y el PEPE.txt sera actualizado añadiendo los archivos nuevos al final del txt, apuntando que el número de backup es el 1 y editando la linea de los archivos que han sido modificados.

Por supuesto, no quiero que me hagan el programa, tengo algo hecho, he de decir, que no tengo experiencia con batch y que es el primer script que intento hacer, he conseguido que me haga un backup que me genere el txt en el formato propuesto... Pero donde empiezo a tener dudas es de cara a la siguiente ejecución del Script. Esto es lo que tengo.

CLS
color a
cd c:\perfiles
dir /ad /b > C:\backup\carpetas.txt
for /f "tokens=*" %%x in (C:\backup\carpetas.txt) do (
cd "C:\perfiles\%%x"
dir /tw /b> C:\backup\archivos.txt
for /f "tokens=*" %%l in (C:\backup\archivos.txt) do (
echo %%~tl>> C:\backup\temporal.txt

for /f "usebackq tokens=1,2,3 delims=/, " %%i in (C:\backup\temporal.txt) do (
if not exist "C:\backup\buc2.tmp" (
echo .> C:\backup\buc2.tmp
echo %%l %%k%%j%%i>> C:\backup\%%x.txt
)
)

del C:\backup\buc2.tmp
del C:\backup\temporal.txt
del C:\backup\archivos.txt
del C:\backup\carpetas.txt
)
cd "c:\Archivos de programa\7-Zip"
7z u "C:\backup\%%x.7z"  "C:\perfiles\%%x" -ms=off -mx=9 -t7z -u- -v4000m -up0q0r2x0y2z0w2!"C:\backup\%%x.7z"
)



Cómo podeis comprobar, las condiciones de los if's estan con archivos que no tienen ninguna utilidad.. Eso es porque intente hacer las condiciones con variables a 0 o a 1, pero, no me funcionaba... Era la única manera, también me esta dando problemas en el tema de hacer echos de variables. A ver si me pueden ayudar, gracias de antemano. Ante cualquier duda, pueden preguntar sin ningun problema.

Eleкtro

#1
Cita de: jorma16 en 31 Julio 2012, 12:21 PM
"nombreArchivo FechaModAAAAMMDD Backup"

Hola, Supongo que con "Backup" te refieres a numerar el número de veces que habeis echo el backup de las carpetas?
Por ejemplo, Si es el primer backup que se hace en el servidor, el número sería "1", Si es el segundo backup que haceis... el numero seria "2", etc, ¿no?.

Aquí tienes la primera parte del script, Aunque ya la tenias hecha, Te la he simplificado para ir progresando yo con la segunda parte que pides, Más tarde miraré de hacerlo.

EDITO: Ligeramente modificado:
@Echo OFF

Set "BACKUPS=C:\Backup"
Set "PERFILES=C:\Perfiles"

PUSHD "%BACKUPS%"
If Not exist "*.tmp" (Fsutil file createnew "0.tmp" 0 >NUL)
FOR /R %%X in (*.tmp) Do (Set /A "BackupNUM=%%~nX", "BackupNUM+=1" & Del /Q "%%X")
Fsutil file createnew "%BackupNUM%.tmp" 0 >NUL

PUSHD "%PERFILES%"
FOR /F "Tokens=*" %%# in ('DIR /B /AD') Do (
PUSHD "%%#"
FOR /R %%@ in (*) Do (FOR /F "tokens=1,2,3,* delims=/ " %%A in ('Echo %%~t@') do (Echo %%C/%%B/%%A ^| %BackupNUM% ^| %%~nx@ >> "%BACKUPS%\%%#.txt"))
CMD /C ""%PROGRAMFILES%\7-Zip\7z.exe" u "%BACKUPS%\%%#.7z" "%PERFILES%\%%#" -ms=off -mx=9 -t7z -u- -v4000m -up0q0r2x0y2z0w2!"%BACKUPS%\%%#.7z""
POPD
)


Salu2








jorma16

Muchisimas gracias máquina... La verdad es que me siento ahora un completo inutil... Me sacas de Java y me pierdo :S Intentaré aprender de tu código...

Gracias tio ;) A ver si conseguimos sacar la parte restante.

Martin-Ph03n1X

  No eres tu trabajo, no eres cuanto tienes en el banco, no eres el auto que conduces, ni el contenido en tu billetera, no eres tus malditos cakis, eres el bailarin cantante del mundo...!!!"

jorma16

Cuanto más leo el código más me pierdo.. tengo que empollar mucho este lenguaje para entenderlo.. Muchisimas gracias por la ayuda que me estais prestando.

A que te refieres con sof mejor? Yo programo los scripts en notepad++, te refieres al IDE que gasto?

Si no es así, a que?

Gracias por vuestra ayuda ;)

Eleкtro

Cita de: jorma16 en 31 Julio 2012, 21:52 PM
A que te refieres con sof mejor?

Creo que se refiere a software especializado en hacer copias de respaldo.

Pero no apoyo el comentario, Cuando es tán sencillo de hacer con un script, Y además hacerlo como uno quiere (Comprimiendolo con 7z, Listando los archivos en el orden que uno quiera, Comprobando el número de copias que se ha echo ya sobre un direcotorio, etc...) esas cosas no lo hacen los programas de backup, Al menos los que yo he conocido.

PD: Mañana sigo con esto.

Saludos.








jorma16

Cita de: EleKtro H@cker en 31 Julio 2012, 22:56 PM
Creo que se refiere a software especializado en hacer copias de respaldo.

Pero no apoyo el comentario, Cuando es tán sencillo de hacer con un script, Y además hacerlo como uno quiere (Comprimiendolo con 7z, Listando los archivos en el orden que uno quiera, Comprobando el número de copias que se ha echo ya sobre un direcotorio, etc...) esas cosas no lo hacen los programas de backup, Al menos los que yo he conocido.

PD: Mañana sigo con esto.

Saludos.

Muchas gracias. Yo estoy... pasito a pasito... la verdad me parece un lenguaje interesante... De momento, mas que complicado, me parece desconocido, pero todo a su tiempo :) toda la ayuda es bien recibida.

P.D: No tengas prisa, bastante que me ayudas ;)

Martin-Ph03n1X

Cita de: EleKtro H@cker en 31 Julio 2012, 22:56 PM
Creo que se refiere a software especializado en hacer copias de respaldo.

Pero no apoyo el comentario, Cuando es tán sencillo de hacer con un script, Y además hacerlo como uno quiere (Comprimiendolo con 7z, Listando los archivos en el orden que uno quiera, Comprobando el número de copias que se ha echo ya sobre un direcotorio, etc...) esas cosas no lo hacen los programas de backup, Al menos los que yo he conocido.

PD: Mañana sigo con esto.

Saludos.
SI LO SE SCRIPTS AHORITA  SON PALABRAS MAYORES JEJEJE YO USO COBIANS
  No eres tu trabajo, no eres cuanto tienes en el banco, no eres el auto que conduces, ni el contenido en tu billetera, no eres tus malditos cakis, eres el bailarin cantante del mundo...!!!"

jorma16

#8
Hola y buenos días.

He andado muy liado y he podido progresar muy poquito en este Script, el progreso a nivel de codigo nuevo, ha sido nulo. Pero en cuanto a conocimiento mio del lenguaje ha sido mayor... Porque gracias a EleKtro H@cker he podido entender mejor el batch y a programar más limpiamente, lo cual para mi personalmente es un gran avance.

Ahora tengo una horita y media libre aqui en el curro y voy a ver si puedo avanzar un poco por mi cuenta. Mi mente ha pensado en seguir el Script de la siguiente manera.

Nos quedamos por la parte de adaptar el código para tener en cuenta a partir de la segunda ejecucion del Script.

Habia pensado varias cosas.


  • Lo primero que tenemos que hacer, seria ver que archivos han sido modificados o añadidos nuevos, para esto, tenemos que mirar las fechas, tanto del .txt correspondiente, como de un DIR hecho en el momento que hacemos el backup, correjidme si me equivoco
  • Una vez localizamos un archivo que tenemos que añadir o que tenemos que sobreescribir porque ha sido modificado tendremos que:

Si el archivo ha sido modificado, tendremos que sobreescribir la linea en el txt, es decir, actualizarlo y agregar ese fichero a un nuevo *.7z que se llamaria igual que el primero pero tendria al final del nombre un 2 o un 3 o cualquier numero dependiendo del backup que sea.

Si el archivo es nuevo, añadirlo al nuevo .7z también y ademas añadir en el txt al final.


Como idea, me parece muy bien, mi problema viene, en la implementacion. Quiero, cojer la fecha y compararla con la que tengo en el .txt y si es mayor, ese archivo tengo que ponerlo en el nuevo *.7z ¿Como lo puedo hacer?

Gracias por vuestra ayuda ;)[/list]

Eleкtro

#9
Bueno, No sé si he acertado con el código, Explico como actua:

Si es el primer backup del perfil:
  • Se compime el perfil en un 7zip: ElektroH@cker.1.7z
  • Se genera una lista de esta manera:
    AAAA/MM/DD [HORA DE MODIFICACION] (NUMERO DE BACKUP DE 7ZIP DE ESTE ARCHIVO) | NOMBRE DEL ARCHIVO

    Ejemplo: ElektroH@cker.txt:
    2012/08/02 [17:45] (1) | test.txt
    2012/08/02 [17:46] (1) | test2.txt
    2012/08/02 [17:47] (1) | test3.txt



    Si no es el primer backup que se realiza del perfil:
  • Se comprime el perfil en un nuevo 7zip sin eliminar el/los perfiles anteriores: ElektroH@cker.2.7z
  • Se buscan archivos modificados en la lista de archivos (ElektroH@cker.txt), Si hay alguno modificado, Se edita la linea, Comentando que el archivo modificado se encuentra en este caso en el backup nº2.7z.

    Ejemplo:
    ElektroH@cker.txt (ANTES):
    2012/08/02 [17:45] (1) | test.txt
    2012/08/02 [17:46] (1) | test2.txt


    ElektroH@cker.txt (DESPUÉS):
    2012/08/02 [17:45] (1) | test.txt
    2012/08/02 [18:03] (2) | test2.txt




    Notas:
    Los archivos modificados/nuevos no se agregan al final de la lista, La lista se ordena por completo alfabéticamente (Me parece más efectivo a la hora de buscar un archivo).
    He omitido crear volumenes de los 7zip (001, 002, etc..), Es un estorbo a la hora de hacer el code, Y no se si te es realmente necesario.


    ServerBackup.BAT:
    Código (DOS) [Seleccionar]
    @Echo OFF
    Title Server Backup By Elektro H@cker
    Setlocal enabledelayedexpansion

    Set "BACKUPS=C:\Users\Administrador\Desktop\Backups"
    Set "PERFILES=C:\Users\Administrador\Desktop\Perfiles"
    Set "SevenZip=%WINDIR%\System32\7z.exe"

    PUSHD "%PERFILES%"
    FOR /F "Tokens=*" %%# in ('DIR /B /AD') Do (
    PUSHD "%%#"
    If not exist "%BACKUPS%\%%#*7z" (Call :First_Backup "%%#") ELSE (Call :Next_Backup "%%#")
    POPD
    )
    Goto :FIN

    :First_Backup
    Echo: [+] Comprimiendo el perfil de %1 | MORE
    "%SevenZip%" u -mx=9 -ms=off -t7z "%BACKUPS%\%~1.1.7z" "%PERFILES%\%~1" >NUL
    FOR /R %%@ in (*) Do (FOR /F "tokens=1-4,* delims=/ " %%A in ('Echo %%~t@') do (Echo %%C/%%B/%%A [%%D] (1^) ^| %%~nx@ >> "%BACKUPS%\%%#.txt"))
    Goto:EOF

    :Next_Backup
    For /F "tokens=2 delims=." %%_ in ('Dir /B "%BACKUPS%\%~1*7z"') do (Set /A "LastNum=%%_", "Lastnum+=1")
    FOR /R %%@ in (*) Do (
    FOR /F "tokens=1-5,* delims=/: " %%A in ('Echo %%~t@;%%@') do (
    Find /I "%%~nxF" "%BACKUPS%\%~1.txt" >NUL && (
    For /F "Tokens=1-4,* Delims=()[] " %%a in ('Type "%BACKUPS%\%~1.txt" ^| Find /I "%%~nxF"') do (
    set "Date=%%a"
    Set "Hour=%%b"
    IF "%%C%%B%%A%%D%%E" GTR "!DATE:/=!!Hour::=!" (
    Type "%BACKUPS%\%~1.txt" | FIND /I /V "%%~nxF" > "%TEMP%\%%#.txt"
    Echo %%C/%%B/%%A [%%D:%%E] (!LastNum!^) ^| %%~nx@ >> "%TEMP%\%%#.txt"
    Move /Y "%TEMP%\%%#.txt" "%Backups%\%~1.txt" >NUL
    )
    )
    ) || (Echo %%C/%%B/%%A [%%D:%%E] (!LastNum!^) ^| %%~nxF >> "%Backups%\%~1.txt")
    )
    )
    Echo: [+] Comprimiendo el perfil de %1 | MORE
    "%SevenZip%" u -mx=9 -ms=off -t7z "%BACKUPS%\%~1.%Lastnum%.7z" "%PERFILES%\%~1" >NUL
    SORT /+25 "%BACKUPS%\%~1.txt" > "%TEMP%\%~1.txt"
    Move /Y "%TEMP%\%~1.txt" "%BACKUPS%\%~1.txt" >NUL
    Goto :EOF

    :FIN
    Echo: Ha finalizado la creacion de copias de seguridad. | MORE
    Timeout /T 30 || Pause
    Exit




    Saludos.