views:

537

answers:

1

I am actually pretty new to this batch file thing. I know it's important to know at least the basic commands. Could somebody help me figure out how to do the following?

  • Zipping a specified folder.
  • Move the folder to another place.
  • When zipping it, the zip file name will be the current date and if there is another zipped file with the same name, it should be named like 20090924-2.

PS: 7-Zip is installed on my computer as an archive software.

+1  A: 

The batch script listed below will do it (I have tested it and it works to specifications). The directory to zip and move is specified as its parent directory and the name of the directory (PARENT_FOLDERTOZIP and FOLDERTOZIP in the beginning) - I couldn't figure out how to copy entire directories (I think XCOPY can only copy content of directories and sub-directories.). The copy location is specified as FOLDERTARGETLOCATION and the directory to place the compressed files in is specified as ZIPDIR.

The location of 7-Zip is configured through SEVENZIP_EXE.

Note also that getting the current date in the required format depends on the short date format in regional settings. I have listed three different versions for ISO-8601, central european and U.S.A. The active one in the listing is for the U.S.A. (the "set FDATE=" line). If a different one is needed then just copy-paste from one of the other two.

That said it should be noted that this kind of thing is much easier with Perl, Python or 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
Peter Mortensen
Thank you very much.
Braveyard