I’ve been talking about the powerful For tool over the
past couple months. For can inject power into any
command-line utility, letting it transform a command
that normally operates on a single file into one that can
work on many files. In the first For column, “The Power of
For” (InstantDoc ID 96539), I discussed how For can turn
a command loose on an entire folder’s worth of files, and
in the second column, “Counting on For” (InstantDoc ID
96704), I showed you how For’s /l option lets you instruct a
command to run any number of times.
This month, I show you how For’s /f option lets you tell
Windows to apply a single command to a specific list of files.
For for Files
This For functionality came to mind a few weeks ago while
I was reviewing the results of a photo shoot. I’d been snapping
dozens of close-up photos of a Snowy Egret from a
photographer’s blind. I had some good, detailed shots,
but most didn’t amount to much. I wanted to burn all the
photos to a DVD but keep the most useful ones on my
computer’s hard disk.
You’d think separating out a few pictures would be
simple—say, by browsing the pictures in one window while
dragging the good ones to another folder. But I needed
to devote a lot of screen real estate to the image browser
and didn’t have enough screen space to hold a couple of
Windows Explorer windows on top of that. But I did have
enough space for a little Notepad window, in which I could
type the names of the files I wanted to keep, leaving me lots
of room for the image browser.
I had a folder full of files called C:\newpics, and I had
created a text file named keepers.txt that listed the photos I
wanted to copy to a folder called C:\goodpics. I wanted to
extract each line in keepers.txt and use it as a filename to
copy to C:\goodpics. How could I use the Windows command
line to accomplish that goal?
I was sure the answer lay in the For command, so I dived
into For’s online Help, which reminded me of the tool’s /f
option. Here’s the command I came up with:
for /f %i in (C:\newpics\keepers.txt) do copy C:\newpics\%i C:\goodpics
To understand this command, look at the simplified For
/f syntax:
for /f <variable> in (<name of file listing the
desired objects>) do <an operation involving the
variable>
For example, to tell For /f to simply display the files that it
will copy, I could type
for /f %i in (C:\newpics\keepers.txt) do echo %i
For /f works its way through keepers.txt by taking one line
at a time and putting the contents of that line in a variable,
a place in memory that I’ve called “%i.” (Any name works,
as long as it’s prefixed with a percent sign.) Then, For /f
performs whatever action you’ve typed to the right of do,
replacing the two letters “%i” with the actual value that For
has most recently extracted from keepers.txt.
Thus, if I type pic1.cr2 on the first line, and pic7.cr2 on
the second and final line, For /f would first execute echo
pic1.cr2, which would cause Windows to just print pic1.
cr2 on the command window, then print pic7.cr2 on that
window and stop.
That’s not all For /f can do. Instead of putting a file
in the parentheses, you can put a command in there,
surrounded by single quotes. For will then execute the
command and use each line of the command’s output as
a line of text to operate on, just as it operated on the lines
in keepers.txt.
For can also accept more than one file as input in the
parentheses, as in a variation on the first example, featuring
both the file keepers.txt and another named keepers2.
txt:
for /f %i in (C:\newpics\keepers.txt C:\newpics\keepers2.txt) do copy C:\newpics\%i C:\goodpics
More to For
There’s more to For, of course. But I think these three visits
with “the original Windows power tool” should give you a
pretty good starting point toward your own For experimentation.
If you learn only one new command-line tool this
year, make it For!