La creación de un archivo por lotes para realizar copias de seguridad en una carpeta específica

StackOverflow https://stackoverflow.com/questions/1474366

Pregunta

De hecho, estoy bastante nuevo en esto de archivos por lotes. Sé que es importante conocer al menos los comandos básicos. ¿Cómo hago lo siguiente?

  • Comprimir una carpeta especificada.
  • Mover la carpeta a otro lugar.
  • Cuando comprimir ella, el nombre del archivo ZIP será la fecha actual y si hay otro archivo comprimido con el mismo nombre, debe ser nombrado como 20090924-2.

PS 7-Zip está instalado en mi equipo como un software de archivo.

¿Fue útil?

Solución

El archivo por lotes se enumeran a continuación lo hará (he probado y funciona con las especificaciones). El directorio para comprimir y movimiento se especifica como su directorio padre y el nombre de el directorio (PARENT_FOLDERTOZIP y en el FOLDERTOZIP comenzando) - no podía encontrar la manera de copiar todo directorios (creo que XCOPY sólo puede copiar el contenido de directorios y subdirectorios.). La ubicación de la copia es especifica como FOLDERTARGETLOCATION, y el directorio para colocar los archivos comprimidos en el se especifica como ZIPDIR.

La ubicación de 7-Zip se configura a través SEVENZIP_EXE.

Tenga en cuenta también que obtener la fecha actual en el requerido formato depende del formato de fecha corta en la región ajustes. He enumerado tres versiones diferentes para ISO-8601, Europa Central y U.S.A. El único activo en el anuncio está para la U.S.A. (la línea "set FDATE ="). Si una uno diferente se necesita entonces simplemente copiar y pegar de una de las otros dos.

Dicho esto debe tenerse en cuenta que este tipo de cosas es mucho más fácil con Perl , Python o PowerShell .


@echo off
@title=Folder zip and move...

rem Parameters
  rem Folder to zip and move
    set PARENT_FOLDERTOZIP=T:\to delete
    set FOLDERTOZIP=Folder to Compress

  rem Target folder for moving the input folder to.
    set FOLDERTARGETLOCATION=s:\move Here

  rem Where to place compressed folders
    set ZIPDIR=D:\toDelete\2009-09-24a


rem Configuration
  set SEVENZIP_EXE=D:\Program Files\7-Zip\7z.exe


rem =================== Date ==============================================
rem There is no universal way inside batch itself to get a
rem date that is independent of regional settings (but is
rem quite trivial if an external program or script
rem (Perl/Python) is available).
rem
rem For short date formats:
rem
rem   -------------------------------------------------------
rem
rem   ISO-8601:
rem     0123456789
rem     yyyy-MM-dd/     E.g.: 2009-09-24
rem
rem     set FDATE=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
rem
rem   -------------------------------------------------------
rem
rem   Central european:
rem     0123456789
rem     dd/MM/yyyy     E.g.: 24/09/2009
rem
rem     set FDATE=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
rem
rem   -------------------------------------------------------
rem
rem   US:
rem
rem     0123456789
rem     MM/dd/yyyy     E.g.: 09/24/2009
rem
rem     set FDATE=%DATE:~6,4%%DATE:~0,2%%DATE:~3,2%

set FDATE=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
set ZIPFILE=%ZIPDIR%\%FDATE%.7z

set FOLDERTOZIP_FULLPATH=%PARENT_FOLDERTOZIP%\%FOLDERTOZIP%
mkdir %FOLDERTARGETLOCATION%


rem Does a zip file already exist?
if exist "%ZIPFILE%" GOTO L_ZIPFILE_EXISTS
GOTO L_ZIPFILENAME_OK


rem Find a compressed file that does not already exist.
:L_ZIPFILE_EXISTS
set RNUM=0
:L_TRYANOTHER
set /a RNUM=%RNUM% + 1
set ZIPFILE=%ZIPDIR%\%FDATE%-%RNUM%.7z
echo Candidate: %ZIPFILE% ...
if exist "%ZIPFILE%" GOTO L_TRYANOTHER


rem Zip the folder!
:L_ZIPFILENAME_OK
"%SEVENZIP_EXE%"  a %ZIPFILE%   "%FOLDERTOZIP_FULLPATH%"

if exist "%ZIPFILE%" GOTO L_OKZIP
GOTO L_ERROREND


:L_OKZIP
rem Move folder: copy, then delete source.
set DEST_FOLDER=%FOLDERTARGETLOCATION%\%FOLDERTOZIP%
mkdir "%DEST_FOLDER%"
xcopy /Y /S "%FOLDERTOZIP_FULLPATH%"\*.*   "%DEST_FOLDER%"\
rmdir /S "%FOLDERTOZIP_FULLPATH%"
GOTO L_END


:L_ERROREND
echo 7-Zipping failed !!!


:L_END

pause
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top