Home NT Commands
NT Syntax

FOR /F

Conditionally perform a command on items in a text file

syntax   
      FOR /F ["options"] %%parameter IN (filenameset) DO command 

      FOR /F ["options"] %%parameter IN ("Text string to process") DO command

key
   options:
           delims=xxx  - The delimiter character(s)
                         (default = a space)
           skip=n      - A number of lines to skip at the beginning of the file. 
                         (default = 0)

eol=; - character to indicate a comment (end of line)
tokens=n - specifies which numbered items to read from each line (default = 1) usebackq - under Win2K/XP the usebackq option specifies that an alternative set of delimiters are to be used: - a literal 'Text string to process' is surrounded by 'SINGLE quotes' rather than "double" so the text itself can contain double quotes. - a command can be placed in `back` quotes (The ` character is usually just below the ESC key) Filenameset : A set of one or more files. Wildcards may be used. If (filenameset) is a period character (.) then FOR will loop through every file in the folder. command : The command to carry out, including any command-line parameters. %%parameter : A replaceable parameter: in a batch file use %%G (on the command line %G)

FOR /F processing of each text file consists of reading the file one line of text at a time and then breaking the line up into individual items of data or 'tokens'. The DO command is then executed with the parameter(s) set to the token(s) found.

By default, /F breaks up the line at each blank space, and any blank lines are skipped.
You can override this default parsing behavior by specifying the "options" parameter. The options must be contained within "quotes"

Tokens
tokens=2,4,6 will cause the second, fourth and sixth items on each line to be processed

tokens=2-6 will cause the second, third, fourth, fifth and sixth items on each line to be processed

tokens=* will cause all items on each line to be processed

tokens=3* will cause the 3rd and all subsequent items on each line to be processed

Specifying more than 1 token will cause additional parameter names to be allocated.

If the last character in the tokens= string is an asterisk, then additional parameters are allocated for all the remaining text on the line.

Delims
Specifying more than one delimiter has been known to cause problems with some data sets, if you have problems try parsing with just one delimiter at a time. When more than one delimiter is specified it's an OR, i.e either delimiter will work. If you don't specify anything it will default to "delims=<tab><space>"

When editing a CMD script notice that many text editors will fail to enter the TAB character correctly.

You can use any character as a delimiter - but they are case sensitive.

An example of parsing a text file:

myfile.txt
[
12-AUG-99,DEPOSIT,450,23,55
; start of the new year
14-JAN-00,WITHDRAWAL,285,122
03-FEB-00,DEPOSIT,200
]

FOR /F "tokens=1,3* delims=," %%G IN (myfile.txt) DO @echo %%G %%H %%I

The command line above will parse each line in myfile.txt, ignoring lines that begin with a semicolon, with tokens delimited by a comma, as shown below.

%%G = token1 = "12-AUG-99"
%%H = token3 = "450"
%%I = tokens 4+ = "23,55"

%%G is explicitly declared in the FOR statement and the %%H and %%I are implicitly declared via the tokens= option. You can specify up to 26 tokens via the tokens= line, provided this does not cause an attempt to declare a parameter higher than the letter 'Z'.

FOR parameter names are global, so in complex scripts which call one FOR statement from within another FOR statement you can refer to both sets of parameters. You cannot have more than 26 parameters active at any one time.

Examples of parsing a text string:
A string of text will be treated just like a single line of input from a file,
the string must be enclosed in double quotes.

Echo the dollar amount and the date
FOR /F "tokens=1,3* delims=," %%G IN ("12-AUG-99,deposit,$45.50,23.7") DO @echo %%H was paid on %%G

Echo only the month and transaction type
FOR /F "tokens=2,4 delims=-," %%G IN("12-AUG-99,deposit,$45.50,23.7") DO @echo %%H was made in %%G

Unicode

Many of the newer commands and utilities (e.g. WMIC) output text files in unicode format, these cannot be read by the FOR command which expects ASCII.
To convert the file format use the TYPE command.

"It's completely intuitive; it just takes a few days to learn, but then it's completely intuitive" - Terry Pratchett.

Related Commands:

FOR - Loop commands

FOR - Loop through a set of files in one folder
FOR /R - Loop through files (recurse subfolders)
FOR /D
- Loop through several folders
FOR /L - Loop through a range of numbers
FOR /F - Loop through the output of a command

FORFILES - Batch process multiple files
GOTO - Direct a batch program to jump to a labelled line
IF - Conditionally perform a command

Equivalent Linux BASH commands:

cut - Divide a file into several columns
case - Conditionally perform a command
eval - Evaluate several commands/arguments
for - Expand words, and execute commands
until - Execute commands (until error)
while - Execute commands



Simon Sheppard
SS64.com