Wednesday, April 20, 2005

Deleting files that are greater than 30 days old

In looking for a way to delete files that are older than 30 days, I came across ForFiles.exe:


ForFiles is useful for a couple of reasons:
1. It replaces the FOR command in the command shell, which is extremely powerful and useful, but a bit of a pain.
2. It allows you to use relative time (in days) to select the files that you want to act upon

Because links often break, I've included the content here. This is a microsoft TechNet article.


Link to article:

Forfiles

Updated: January 21, 2005
**
**

Forfiles

Selects files in a folder or tree for batch processing.

Syntax

forfiles [/p Path] [/m SearchMask] [/s] [/c Command] [/d[{+ | -}] [{MM/DD/YYYY | DD}]]

Parameters

/p Path

Specifies the Path on which you want to start searching. The default folder is the current working directory, which you specify by typing a period (.).

/m SearchMask

Searches files according to SearchMask. The default SearchMask is *.*.

/s

Instructs forfiles to search in subdirectories.

/c Command

Runs the specified Command on each file. You must wrap command strings with spaces in quotation marks. The default Command is "cmd /c echo @file".

/d[{+ | -}] [{MM/DD/YYYY | DD}]

Selects files with a date greater than or equal to (+) or less than or equal to (-) the specified date, where MM/DD/YYYY is the specified date and DD is the current date minus DD days. If you do not specify + or -, + is used. The valid range for DD is 0 - 32768.

/?

Displays help at the command prompt.

Remarks

Forfiles is most commonly used in batch files.

Forfiles /s is similar to dir /s.

The following table list the variables that you can use in the /cCommand command string.


VariableDescription

@file

File name

@fname

File name without extension

@ext

File extension

@path

Full path of the file

@relpath

Relative path of the file

@isdir

Evaluates to TRUE if a file type is a directory, otherwise it evaluates to FALSE

@fsize

File size in bytes

@fdate

Last modified date stamp on the file

@ftime

Last modified time stamp on the file

With forfiles, you can run a command on or pass arguments to multiple files. For example, you could run the TYPE command on all files in a tree with the *.txt extension. Or, you could execute every batch file (*.bat) on the C:\ drive with the file name "Myinput.txt" as the first argument.

With forfiles, you can do any of the following:

Select files by an absolute or a relative date using /d.

Build an archive tree of files using variables such as @fsize (file size) and @fdate (file date).

Differentiate files from directories using the @isdir variable.

Format output by including special characters in the command line and surrounding the characters with the hexadecimal code 0xHH.

Forfiles works by implementing the recurse subdirectories flag on tools designed to process only a single file.

Examples

To list all of the batch files on drive C:, type:

forfiles /p c:\ /s /m*.bat /c"cmd /c echo @file is a batch file"

To list all of the directories on drive C:, type:

forfiles /p c:\ /s /m*.* /c"cmd /c if @isdir==true echo @file is a directory"

To list all of the files older than 100 days on drive C:, type:

forfiles /p c:\ /s /m*.* /dt-100 /c"cmd /c echo @file : date >= 100 days"

To list all of the files older than January 1, 1993 on drive C:, and then display "file is quite old!" for files with a date older than 01/01/1993, type:

forfiles /p c:\ /s /m*.* /dt-01011993 /c"cmd /c echo @file is quite old!"

To list all of the extensions of all of files on drive C: in column format, type:

forfiles /p c:\ /s /m*.* /c "cmd /c echo extension of @file is 0x09@ext0x09" With:

To list all of the batch files on drive C:, type:

forfiles /p c:\ /s /m *.bat /c "cmd /c echo @file is a batch file"

To list all of the directories on drive C:, type:

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"

To list all of the files older than 100 days on drive C:, type:

forfiles /p c:\ /s /m *.* /d t-100 /c "cmd /c echo @file : date >= 100 days"

To list all of the files older than January 1, 1993 on drive C:, and then display "file is quite old!" for files with a date older than 01/01/1993, type:

forfiles /p c:\ /s /m *.* /d t-01011993 /c "cmd /c echo @file is quite old!"

To list all of the extensions of all of files on drive C: in column format, type:

forfiles /p c:\ /s /m*.* /c "cmd /c echo extension of @file is 0x09@ext0x09"

Formatting legend


FormatMeaning

Italic

Information that the user must supply

Bold

Elements that the user must type exactly as shown

Ellipsis (...)

Parameter that can be repeated several times in a command line

Between brackets ([])

Optional items

Between braces ({}); choices separated by pipe (|). Example: {even|odd}

Set of choices from which the user must choose only one

Courier font

Code or program output

Microsoft Word will not work on a server on which it is not installed

Turns out that Microsoft Word won't work on a server on which it's not installed :)

I support a program that interfaces with the InSystems Calligo Assembly Engine (or assembly server, depending on configuration) through DCOM using the InSystems assembly link toolkit.

We have, over the years, decided to take advantage of every API that the assembly link toolkit affords, and therefore do our printing through a AssemblyLinkDocument.PrintDoc() method.

As it turns out, the .print() method does a very strait-forward automation of MS-Word to accomplish it's printing, and will therefore not work when Word is not isntalled.

This manifest itself by an HResult of 0x80010105 on the call PrintDoc. Some initial googling of the value indicated that this is what you get when you try to invoke a method on an object that has yet to be instantiated.

Minimally Logged Operations in SQL Server

I'm posting this mostly so I can find it later :) The following article has a great table that defines when operations will be minimall...