Batch Files (Scripts) in Windows
Batch Files (Scripts) in Windows
By Vic Laurie
Systems administrators and power users are well aware of the utility of batch files but the average PC user
is generally unacquainted with them or is intimidated by the notion of writing or even running a script. This is
unfortunate since it means that many are foregoing the use of a powerful tool for carrying out routine or
repetitive tasks. Although batch files can be quite sophisticated and used for complicated network and
system administration, they can also be of the utmost simplicity and very brief. In this article, I will introduce
the batch file and discuss some uncomplicated examples that make basic tasks easier.
These are simple text files containing some lines with commands that get executed in sequence, one after
the other. These files have the special extension BAT or CMD. Files of this type are recognized and
executed through an interface (sometimes called a shell) provided by a system file called the command
interpreter. In Windows XP/ Vista the command interpreter is the file cmd.exe. The large assortment of
versatile commands available in Windows XP/Vista/7 makes batch files a powerful tool.
Constructing a batch file consists of nothing more than opening any text editor like the accessory Notepad,
entering some lines containing commands, and saving the file with an extension BAT or CMD. (The CMD
extension is limited to newer Windows systems and is not recognized in Windows 9x/Me systems. In
Windows XP, Vista, and 7 there is little practical difference between the two extensions.) Don't use Wordpad
or Word unless you are very careful to save all files in pure text format. The commands themselves are
often quite simple and there is no need to learn a programming language. Those who wish can explore the
intricacies that are available with branching and looping but here I will confine the discussion to some
straightforward application to everyday tasks. The focus will be on saving time and effort for some routine
stuff like system housekeeping and simple file management.
Running a batch file is a simple matter of clicking on it. Batch files can also be run in a command prompt or
the Start-Run line. In that case, the full path name must be used unless the file's path is in the path
environment.
this display. The command "echo off" turns off the display for the whole script, except for the "echo off"
command itself. The "at" sign "@" in front makes the command apply to itself as well. This nuance isn't
really all that important in the context here but I mention it because it is often seen in scripts. The scripts we
will discuss are very brief and omitting this line won't make any great difference. However, as a matter of
Our first batch file example is going to list all the files in a folder and put the list in a new text file . We will
use the directory command "dir" that is discussed on another page. Open Notepad and enter the line
"@echo off" (without quotes). Next enter another line
dir "C:\Program Files" > C:\list_of_program_files.txt
(I'm assuming that your Program Files folder is on the C: drive). This will give us the two-line file
@echo off
Now save this two-line file as "listprograms.bat" (without quotes) to some convenient location. Be sure that
Notepad is saving as "All files" and not as a text file. See the figure below.
Three important points are illustrated in the example script. Note that complete paths are used for files
including the drive letter. Also note the quotes around "C:\Program Files". Paths must be quoted whenever
a file or folder name has a space in it. Finally note the redirection symbol ">" that is used to send the output
to a file instead of the screen.
All that has to be done to use the file is to double-click it. A file C:\list_of_program_files.txt will then be
created.
The file that we have been discussing is limited to listing one particular folder and putting the list in one
particular file. However, it is easy to make the file able to list whatever folder we want and to put the list
wherever we want. Batch files can use arguments or data that is input from the user. The process makes
use of placeholders of the form %1, %2, These are replaced in the script by our input data. This type of
situation cannot be clicked directly but should be run in a command prompt. The new batch file would be
@echo off
dir %1 > %2
Enter in Notepad and save as "makelist.bat". To run the file, open a command prompt and enter
{path}makelist somefolder somewhere\list.txt
where somefolder is whatever folder (with complete path) that you want to list in somewhere\list.txt. Now
you have a little program that will list the contents of a folder whenever you want. If you want a list of all the
subfolders as well, use the command
dir /s %1 > %2
If you want a list that only includes files of a certain type, MP3 files for example, use
dir %1\*.mp3 > %2
The line above illustrates the use of the wildcard "*". The ability to use wildcards greatly enhances the
Life will be easier if you put all batch scripts in a folder that is in the path environment.
Very often batch files contain lines that start with "Rem". This is a way to enter comments and
documentation. The computer ignores anything on a line following Rem. For batch files of any complexity,
comments are a good idea. Note that the command interpreter actually reads Rem statements so using too
More examples
Following the discussion on another page, it is easy to create batch files for some typical maintenance. To
create a very simple backup script, use xcopy. The code might be
xcopy %1 %2 /d /s
This will update all files in the input source folder %1 and its subfolders by copying to the backup folder %2.
In practice, a useful backup script would probably need a few more of the switches discussed at xcopy.
Again following previous discussion of the command "del", a file to delete all temporary files with extension
You can also interact with a user and ask that data be entered. The old DOS had a "Choice" command for
very limited interaction but that has been superseded in Windows XP/Vista by the more versatile "set /p".
"Variable" is the name of the variable that will be assigned to the data that you want the user to input.
"String" is the message that the user will see as a prompt. If desired, "string" can be omitted. Here is an
This will create a variable %name% whose value is whatever the user enters. Note that the user must press
Further reading
These are simple examples and this page does not pretend to explain everything about batch files. The idea
is to show how simple they are and to intrigue readers to look further into the subject. Even more powerful
batch files can be constructed with the addition of simple decision making and methods of doing the same
thing many times. Branching with "If" and "Goto" are discussed next ; using "For" to do repetitive tasks is
Batch files are discussed in many books on Windows, at numerous Web sites and at this Microsoft site.
Even if you do not want to write them, there are many already available for your use. This page at a sister
batch files containing just a few lines, the full power that is available can only be realized with the more
advanced methods of branching, iterating, and looping. These methods are among the tools used by
programmers to create very sophisticated scripts. However, the concepts are actually quite easy to grasp.and
are accessible to those with no background in programming. Just a few extra lines in a batch file using these
tools can add a very significant increase in versatility and power. On this page, I will discuss branching. In part
two of more advanced methods I will introduce iterative methods.
Batch files can make decisions and choose actions that depend on conditions. This type of action makes use
The second part of the statement (in parentheses) is optional. Otherwise, the system just goes to the next line
in the batch file if the first condition isn't met. The actual syntax is
If (condition) (command1) Else (command2)
The "Else" part is optional. The form "If not" can also be used to test if a condition is false. Note that "If" tests
There is a special "If exist" statement that can be used to test for the existence of a file, followed by a
Another special case is "if defined ", which is used to test for the existence of a variable. For example:
if defined somevariable somecommand
This can also be used in the negative form, "if not defined".
run. Various commands issue integer exit codes to denote the status of the command. Generally, commands
pass 0 if the command was completed successfully and 1 if the command failed. Some commands can pass
additional code values. For example, there are five exit code values for Xcopy. These exit code values are
stored in the special variable errorlevel. An example command would be:
if errorlevel n somecommand
where "n" is one of the integer exit codes. Note that the comparison is done by checking if errorlevel is greater
than or equal to n. If used with "not" the comparison checks if errorlevel is less than n.
Operator Meaning
Comparison operators
EQU equal to
In some cases the condition to be met is obtained by comparing strings.
NEQ not equal to
For example
if string1 == string2 LSS less than
Note that the "equals" sign is written twice. This condition is met if the
LEQ less than or equal to
two strings are exactly identical, including case. To render comparisons
insensitive to case, use the switch "/i". For more general comparisons, GTR greater than
use the operators in Table I. (The operators are given in upper case in
greater than or equal
the table but they are not case-dependent.) Numerical comparisons only GEQ
to
work with all-digit strings. Otherwise, the comparison is done
alphabetically. For example "a" is less than "b". For case independence, use the switch "/i". An example
command might read:
if /i string1 gtr string2 somecommand
When comparing variables that are strings, it may be best to enclose the variable name in quotes. For
example, use:
if "%1" == somestring somecommand
Generally, the execution of a batch file proceeds line-by-line with the command(s) on each line being run in
turn. However, it is often desirable to execute a particular section of a batch file while skipping over other parts.
The capability to hop to a particular section is provided by the appropriately named "goto" command (written
as one word). The target section is labeled with a line at the beginning that has a name with a leading colon.
goto :label
...some commands
:label
Execution will skip over "some commands" and start with "some other commands". The label can be a line
Sometimes it is desirable to terminate a script if a certain condition is met (or not met). One way to exit is to
use the special label :eof in a goto command. The label is not actually placed in the batch file. Windows XP
and later recognize :eof without any label explicitly placed at the end of the batch file. Thus if you need to test
for a particular condition that makes script termination desirable, you can write:
if (condition) goto :eof
Note that this terminates the script but does not necessarily close the command shell.
An ancient method for doing repetitive tasks uses a counter,"if" statements, and the "goto" command. The
counter determines how many times the task is repeated, the "if" statement determines when the desired
number of repetitions has been reached, and the "goto" command allows for an appropriate action to be
executed, either the repetitive task or exiting. Generally, the more elegant methods provided by the powerful
"for...in...do" command are preferable and they are discussed on the next page. However, for completeness
and to illustrate some of what we have discussed, I will give an example that uses the clumsier method.
The simple script below creates the numbers 1 to 99 and sends them to a file. It uses the "set" command to
create a variable that is also the counter for how many times we have iterated.
@echo off
set /a counter=0
:numbers
set /a counter=%counter%+1
if %counter% ==100 (goto :eof) else (echo %counter% >> E:\count.txt)
goto :numbers
(Best programming practice would dictate that the variable %counter% be localized or destroyed at the end
but for simplicity I have omitted the several extra lines needed to do that. As written, this environment variable
would persist until the command shell itself, not just the script, was closed.)
In anticipation, I can note that the same result as the script above can be achieved with a two-line script using
Computers are very good at doing the same thing over and over. The command line contains a powerful
and versatile method for carrying out this type of operation. With this method, you can automate many
(For those who persist in calling the command line DOS, note that the 32-bit version of the "For"
statement is much more powerful than the old 16-bit DOS version.)
A single-letter replaceable variable is used to represent each item as the command steps through the the
collection (called a "set"). Note that, unlike most of Windows, variables are case-dependent. Thus "a"
and "A" are two different variables. The variable has no significance outside the "For" statement. I will be
using X throughout the discussion but any letter will do. (In principle, certain non-alphanumeric
characters can also be used but that seems like a bad idea to me.) The variable letter is preceded with a
single percent sign when using the command line directly or double percent signs in a batch file. Thus
the statement in a batch file looks like this:
for %%X in (set) do (command)
What makes the "For" statement so powerful is the variety of objects that can be put in the set of things
that the command iterates through, the availability of wildcards, and the capability for parsing files and
command output. A number of switches or modifiers are available to help define the type of items in the
set. Table I lists the switches. They are listed in upper case for clarity but are not case-sensitive.
Switch Function
I will consider a number of examples that illustrate the use of "For" and its switches.
The set of things that are to used can be listed explicitly. For example, the set could be a list of files:
for %%X in (file1 file2 file3) do command
(Care must be taken to use correct paths when doing file operations.) A different example where the set
This will carry out the command on all files in the working directory with extension "jpg". This process can
be carried further by using several members in the set. For example to carry out a command on more
As always, keep in mind that the command line may choke on file names with spaces unless the name is
enclosed correctly in quotes. Therefore, you might want to use "%%X" in the "command" section.
The well known action of stepping through a series of values that was discussed in connection with "if"
and "Goto" statements is succinctly done with the switch /l (This switch is an "ell", not a "one") . The
The set consists of integers defining the initial value of X, the amount to increment (or decrement) X in
each step, and the final value for X when the process will stop. On the previous page, I gave an example
batch file that listed all the numbers from 1 to 99. If we use a "For" statement, that task can be
accomplished with one line:
for /l %%X in (1,1,99) do (echo %%X >> E:\numbers.txt)
The numbers in the set mean that the initial value of X is 1, X is then increased by 1 in each iteration,
and the final value of X is 99.
If you wish to use directories in the variable set, use the switch /d. The form of the command is
for /d %%X in (directorySet) do command
An example that would list all the directories (but not sub-directories) on the C: drive is
for /d %%X in (C:\*) do echo %%X
If you want a command to apply to the sub-directories as well as a parent directory, use the switch /r.
Then the command has the form:
for /r [parent directory] %%X in (set) do command
Note that you can designate the top directory in the tree that you want to work with. This gets around the
often cumbersome problem of taking into account which is the working directory for the command shell.
Now we come to a truly powerful switch that was not even dreamed of back in the DOS days of yore.
The switch /f takes us into advanced territory so I can only indicate the many aspects of its application.
Things become rather complex so those who are interested should consult programming books or the
Microsoft documentation. However, here is a brief sketch of what's involved.
This version of the "For" command allows you to examine and parse text from files, strings, and
"Options" are the text matching criteria and "source" is where the text is to be found. One of the
interesting applications is to analyze the output of a command or commands and to take further action
Declaring variables with the "set" command and their use is discussed.
but play a lesser role in the Windows command line. Many commands are predefined and the scope of
variables is rather limited. Nonetheless, there are important applications of the command line where variables
must be employed and in this article I will outline how the command line uses variables.
In one sense, there are two categories of variables for the command line. Some might use the term "variable"
for the placeholders or arguments %1, %2, ..%9, that are used to represent user input in batch files. (See the
discussion on this page.) However, the term "variable" is normally reserved in command line usage for entities
that are declared as environment variables with the "set" command. Note that this is a pretty primitive way to
define variables. For example, there is no typing. Environment variables, including numbers, are stored as
strings and operations with them have to take that into account. Variables are declared and given a value in a
single statement using "set". .The syntax is:
set some_variable = some_value
Variable names are not case-sensitve and can consist of the usual alphanumeric and other common
characters. Some characters are reserved and have to be escaped. They should be avoided. These include
the symbols in Table II on this page. Also, since these are environment variables, their names should be
. The percent signs are not used in the left side of the set statement that declares a variable.
Localizing variables
The declaration of a variable lasts as long as the present command window is open. If you are using a batch
file that does not close its instance of the command window when the batch file terminates, any variables that
the batch file declares remain. If you wish to localize a variable to a particular set of statements, use the
"setlocal" and "endlocal" commands. Thus. to confine a variable declaration to a particular block of code, use:
....
setlocal
...some statements
endlocal
...
Variables from user input
The "set" command can also accept input from a user as the value for a variable. The switch "/p" is used for
this purpose. A batch file will wait for the user to enter a value after the statement
set /p new_variable=
When the user has entered the value, the script will continue. A message string to prompt for input can also be
used. For example:
set /p new_variable="Enter value "
Note the space at the end of the prompt message. Otherwise, the prompt message and the user-entered value
will run together on the screen. It works but it looks funny. The user may be tempted to hit the spacebar, which
Arithmetic operations
The command line is not designed for handling mathematical functions but it is possible to do some very
simple integer arithmetic with variables. A switch " /a" was added to the "set" command to allow for some basic
functions. Primarily, the use is adding and subtracting. For example, it is possible to increment or decrement
counters in a loop. In principle, it is also possible to do multiplication and division.but only whole numbers can
be handled so the practical use is limited. Although variables are stored as strings, the command interpreter
recognizes strings that contain only integers, allowing them to be used in arithmetic expressions. The syntax is
set /a some_variable={arithmetic expression}
The four arithmetic operators are shown in Table I. (I have omitted a "modulus" operation, which uses the %
sign in yet another way. In my opinion this just adds difficulty to an already quirky syntax. Using % in more than
one sense can only confuse.)
Symbol Operation
+ Addition
- Subtraction
* Multiplication
/ Division
Variables are often used in comparisons in conditional statements in batch files. Some of the comparison
operators that are used are given in Table I of the page on "If" statements. Because of the somewhat loose
way that the command line treats variables, it is necessary to be careful when comparing variables. For
strings, the safest way is to quote variables. For example:
if "%variable1%" == "%variable2%" some_command