Automatizar una tarea de copia de seguridad de una carpeta (comprimir, mover y luego cambiar el nombre según la convención de nomenclatura)

Automatizar una tarea de copia de seguridad de una carpeta (comprimir, mover y luego cambiar el nombre según la convención de nomenclatura)

Estoy intentando automatizar la copia de seguridad de una carpeta en un servidor Windows 2003 R2 (actualmente un proceso manual).

Esta tarea tiene tres componentes:

1) Genere un archivo zip de la siguiente carpeta en el mismo directorio, sin utilizar software de terceros:

d:\source\folder_to_back_up

Lo que nos da:

d:\source\folder_to_back_up.zip

2) Mueva el archivo zip recién creado a:

d:\destination

3) Cambie el nombre del archivo zip según la siguiente convención de nomenclatura:

Backup_YYYYMMDD.zip

Por ejemplo, usando la fecha de hoy, el nombre sería:

Backup_20150516.zip

Hasta ahora, he descubierto cómo automatizar el paso 2:

robocopy /mov d:\source d:\destination folder_to_back_up.zip

...pero necesito ayuda para automatizar la creación del archivo zip y también el paso de cambio de nombre.

¡Cualquier idea será altamente apreciada!

Respuesta1

Desde que comenzaste a considerar 7-zip en los comentarios de la otra respuesta, así es como lo hice:

set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination
rem # a: Add, -mx: compression level 0-9, -tzip use ZIP format, -ssc: case sensitive, -ssw: add files opened for writing, -r: recursive
pushd "%SOURCE%" && 7za a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd

Tenga en cuenta que esto es esencialmente una sola línea si inserta las variables de origen y destino. El par pushd/ popdestá ahí para que el contexto no cambie en caso de que esté realizando varias copias de seguridad en un lote. %date%es un incorporado.

No creo que sea razonable querer crear un formato de archivo especial (zip) sin las herramientas adecuadas. Es como querer compilar el código fuente de Java en archivos jar sin un JDK.

Dependencias

Puede solucionar el problema de eliminar la herramienta colocando el código anterior backup_stuff.baty copiándolo 7za.exejunto al archivo nombrado backup_stuff.bat-7za.exey luego solo necesita reemplazarlo 7zacon %~dp0\backup_stuff.bat-7zapara hacer referencia exactamente a ese archivo. Esto debería transmitir el mensaje de que hay una dependencia externa aquí...

Alternativamente, si quieres ser realmente paranoico, simplemente inserta 7zip en el archivo por lotes :)

set SOURCE=d:\source\folder_to_back_up
set DEST=d:\destination

goto deps

:exec
pushd "%SOURCE%" && "%TEMP%\7za" a -mx9 -tzip -ssc -ssw -r "%DEST%\Backup_%date%.zip" & popd
goto end

:deps
@(
rem This is the Base64 enconded version of 7za.exe
rem To create this section execute the following commands:
rem certutil -encode 7za.exe 7za.exe.b64
rem echo @echo off>7za.exe.b64.bat && for /F "tokens=*" %L in (7za.exe.b64) do @echo echo %L>>7za.exe.b64.bat

echo -----BEGIN CERTIFICATE-----
echo TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo AAAAAAAAAAAAAAAA+AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
echo dCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAB9EXJSOXAcATlwHAE5cBwB
echo QmwQATtwHAG6bBIBIHAcAQ9WFgFbcBwBt3hDAThwHAE5cB0BlnAcAbp4QQE+cBwB

rem ... lot of lines ommitted for sake of stackoverflow

echo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
echo -----END CERTIFICATE-----
)>%TEMP%\7za.exe.b64
certutil -decode -f %TEMP%\7za.exe.b64 %TEMP%\7za.exe >NUL

goto exec

:end

Mi cmd falló cuando intenté hacer esto con el archivo exe original de 7-zip v9.20. Parece que hay una limitación en la longitud del bloque (...); encontré que ronda los 370 kB (aproximadamente 5000 líneas de b64). El base64 original de 7-zip era de 800kB, pero eso no es gran cosa, porque se puede dividir en varios @(...)>>target.filebloques que están por debajo del límite. Pero sugiero ejecutarlo, upx --brute 7za.exelo que hace que el archivo exe tenga un tamaño inferior a 300 kB.

Fuentes

Respuesta2

Puede crear un archivo zip a partir de un archivo por lotes. Esto se puede hacer usando el código del software Shell.Application en Microsoft Windows y se puede hacer usando una línea de comando, pero se necesita algún código adicional. p.ej,La respuesta de Ansgar Wiechers a la pregunta del usuario2868186contiene código (cerca de la parte inferior) que parece sólido. Como alternativa,La página de Rob Vanderwoude en EBVtambién muestra una solución.

Puede que no le guste la idea de necesitar estas 8-12 líneas (cantidad estimada) de VBScript. Bueno, ese es el mejor método disponible que he encontrado para automatizar las cosas y al mismo tiempo confiar en la menor cantidad de código agregado a MS Windows. No creo que MS Windows (al menos no la versión que estás solicitando) proporcione una forma de hacerlo con menos código.

Sin embargo, si vas a agregar ese código regularmente, probablemente querrás descargarlo, en lugar de escribirlo más de una vez. Y si lo estás descargando, te sugiero que también descargues algún otro código, como 7-Zip o Info-Zip. Es posible que 7-Zip tarde más tiempo en aprender a usarlo desde la línea de comandos, pero he tenido éxito con él. Y si no va a hacer esto más de una vez, entonces probablemente esa sea otra razón por la que agregar software una vez probablemente sea una buena solución a largo plazo (inversión mínima de tiempo, recompensa a largo plazo). Entiendo que usar dicho software no es precisamente lo que usted pidió, pero lo menciono de todos modos porque sugiero considerar realmente si termina siendo la mejor solución.

Con respecto al tercer paso, coloque lo siguiente en un archivo por lotes:
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c%%a%%b) echo %mydate% Tenga en cuenta que el comando FOR que se muestra está diseñado para ejecutarse desde un archivo por lotes. Intentar ejecutar exactamente el mismo comando fuera de un archivo por lotes tampoco funcionará. Probé en Win7 SP1. No tengo un servidor 2003 R2 a mano para probarlo, pero supongo que este enfoque funcionará bien para usted.

Por la presente doy crédito aLa respuesta de Jay a la pregunta de Rory sobre el tiempo.como base para este enfoque.

información relacionada