Tuesday, July 1, 2008

Week 27 Article 01 - Batch scripting for removal of older files

With so many scripting languages out there, it is sometimes a wonder why someone would choose batch scripts. I choose them mostly for their simplicity. Some would argue about this but then again everyone has their own views.

Recently I came across a mammoth task. One of the backup programs used by a client wasn't behaving as expected. Some background would be helpful at this point so here goes. Backups were done on two removable hard disks, one used one week and then interchanged with the other. The disconnected hard disk was taken off site for storage. The backup software would create a base image of the system on the first day of the week and every consecutive day, it would do an incremental backup. If all went well, by the end of the week, one would have a backup set that could recover a file deleted within the last 5 days. Now here comes the problem! The hard disk has got a limited capacity and can hold only so many files. As instructed in the settings of the backup program, it was supposed to keep two full sets of backups (a full set being a base image plus the incrementals based on it) and to delete any additional sets if it ran out of space on that particular hard disk (deletions using FIFO method). But the deletions were not happening properly and sometimes the backups failed due to unavailability of space. To solve this problem, I resorted to using my favorite tool, scheduled batch scripts and in the process came across a beautiful tool, which was distributed as part of the Windows 2000 Resource Kit but is now integrated into Windows 2003 as a standard. [Take note of this commands ability to search for files older than a certain age, the /D parameter]

FORFILES [/P pathname] [/M searchmask] [/S][/C command]
[/D [+ | -] {dd/MM/yyyy | dd}]

Selects a file (or set of files) and executes a command on that file. This is
helpful for batch jobs.

Parameter List:
/P pathname Indicates the path to start searching. The default folder is
the current working directory (.).

/M searchmask Searches files according to a searchmask. The default
searchmask is '*' .

/S Instructs forfiles to recurse into subdirectories.
Like "DIR /S".

/C command Indicates the command to execute for each file. Command
strings should be wrapped in double quotes.

The default command is "cmd /c echo @file".

The following variables can be used in the
command string:
@file - returns the name of the file.
@fname - returns the file name without extension.
@ext - returns only the extension of the file.
@path - returns the full path of the file.
@relpath - returns the relative path of the file.
@isdir - returns "TRUE" if a file type is a directory, and
"FALSE" for files.
@fsize - returns the size of the file in bytes.
@fdate - returns the last modified date of the file.
@ftime - returns the last modified time of the file.

To include special characters in the command line, use the
hexadecimal code for the character in 0xHH format (ex. 0x09
for tab). Internal
CMD.exe commands should be preceded with "cmd /c".

/D date Selects files with a last modified date greater than or
equal to (+), or less than or equal to (-), the specified
date using the "dd/MM/yyyy" format; or selects files with a
last modified date greater than or equal to (+) the current
date plus "dd" days, or less than or equal to (-) the
current date minus "dd" days. A valid "dd" number of days
can be any number in the range of 0 - 32768.
"+" is taken as default sign if not specified.

/? Displays this help message.

FORFILES /S /M *.txt /C "cmd /c type @file | more"
FORFILES /P C:\ /S /M *.bat
FORFILES /D -30 /M *.exe
/C "cmd /c echo @path 0x09 was changed 30 days ago"
FORFILES /D 01/01/2001
/C "cmd /c echo @fname is new since Jan 1st 2001"
FORFILES /D +1/7/2008 /C "cmd /c echo @fname is new today"
FORFILES /M *.exe /D +1
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"


Kania Tiko said...

The CMD shell might not be as powerful as other scripting languages, but at least you know that it will run on every windoze box out there!

Niv said...

yup .. couldnt have put it better myself kania tiko