FORFILES.exe (Native command in Vista/Windows7/2008, via Resource Kit for XP)

Select a file (or set of files) and execute a command on each file. Batch processing.

      FORFILES [/p Path] [/m SrchMask] [/s] [/c Command] [/d [+ | -] {date | dd}]   

   /p Path      The Path to search  (default=current folder)

   /m SrchMask  Select files matching the specified search mask
                default = *.*

   /s           Recurse into sub-folders

   /C command   The command to execute for each file.
                Wrap the command string in double quotes.
                Default = "cmd /c echo @file"

                The Command variables listed below can also be used in the
                command string.

   /D date      Select files with a last modified date greater than or 
                equal to (+), or less than or equal to (-),
                the specified date, using the region specific date format
                typically "MM/DD/yyyy" or "DD/MM/yyyy"

   /D + dd      Select files with a last modified date greater than or
                equal to the current date plus "dd" days. (in the future)

   /D - dd      Select files with a last modified date less than or
                equal to the current date minus "dd" days. (in the past)

                A valid "dd" number of days can be any number in
                the range of 0 to 32768.   (89 years)
                "+" is taken as default sign if not specified.

   Command Variables:
      @file    The name of the file.
      @fname   The file name without extension.                
      @ext     Only the extension of the file.                  
      @path    Full path of the file.
      @relpath Relative path of the file.          
      @isdir   Returns "TRUE" if a file type is a directory,
               and "FALSE" for files.
      @fsize   Size of the file in bytes.
      @fdate   Last modified date of the file.
      @ftime   Last modified time of the file.

Commands with arguments

Running a command + argument such as FORFILES /C "PING -a" will fail due to a bug in the way that FORFILES calls the CreateProcess API function. The expected convention is that the first argument argv[0] will be the program name and the second argv[1] will be the first argument, FORFILES does not follow this convention, instead passing the first argument as argv[0].

A slightly clunky looking but effective workaround for this is to include the program name as the first argument, this will be passed along by FORFILES and the CreateProcess will then work as expected:

FORFILES /c "PING Ping -a"

To run an Internal CMD.exe command, prefix it with cmd /c , this is also required if you want to use complex arguments: redirection, pipes, command concatenation etc.

If ForFiles finds one or more matches if will return %errorlevel% =0
If ForFiles finds no matches if will return %errorlevel% =1 and will print "ERROR: No files found with the specified search criteria."

To include special characters in the command line, use the hex code for the character in 0xHH format (ex. 0x09 is theTAB character, 0x22 is the double quote " character.) so "C:\Program Files\" becomes ^0x22C:\Program^ Files\^0x22

Early versions of FORFILES were supplied in the NT resource kits and used unix style '-' parameters, (still supported for backwards compatibility) also the /D option accepted dates only in DDMMYYYYHHMN format.

Last modified dates set in the future are not common but can happen when your computer clock date/time is changed e.g. due to daylight savings time.


Delete the testfile if it is is 5 days old or older:
C:\> forfiles /m testfile.txt /c "cmd /c Del testfile.txt " /d -5

Find .xls file that were last modified 30 days ago or older
C:\> FORFILES /M *.xls /C "cmd /c echo @path was changed 30 days ago" /D -30

List the size of all .doc files:
C:\> FORFILES /S /M *.doc /C "cmd /c echo @fsize"

Rule #1: Don’t sweat the small stuff.
Rule #2: It's all small stuff - Dr Robert S Eliot, University of Nebraska cardiologist


Syntax - Delete files older than N days
OldNewThing - Combining ForFiles and FOR
FOR - Conditionally perform a command several times.
Powershell: ForEach-Object - Loop for each object in the pipeline
Equivalent bash command (Linux): find - Search for files that meet a desired criteria

© Copyright 1999-2015
Some rights reserved