Section 6.5. MS-DOS Batch Files

6.5. MS-DOS Batch Files

Most Windows books treat batch files as if they were some kind of skeleton in the closet or a crazy aunt you wouldn't want anyone to meet. While it's true that batch files are much less important than they were in DOS and earlier versions of Windows , they can still provide useful functionality.

The Windows Script Host (WSH), discussed in Chapter 9, makes it easier to use much more advanced scripting languages, such as Visual Basic, Perl, PerlScript, JavaScript, or Python. But even with WSH, batch files are not completely obsolete.

A batch file is an ASCII text file containing a series of commands, each on its own line, that will be executed one line at a time. The filename of the batch file becomes a command that can be executed at the Command Prompt, from another batch file, or even run from a Windows Shortcut.

Although any commands you can type at the command line can be used in a batch file, several additional commands can be used only in a batch file. These commands are used for loops , conditionals, and other programming functions within the batch file and are explained in detail later in this chapter.

6.5.1. Creating Batch Files

You can create batch files with any text editor or word processor that can save plain ASCII text files, such as Notepad. In fact, by default, you can right-click any batch file and select Edit to open that file in Notepad.

When naming a batch file, make sure you don't use a name that is already used by a DOS internal command (such as dir , copy , or cd ) or by a .com or .exe file in your search path . The reason for this is that when DOS executes programs, it first looks for the .com extension and then the .exe extension before finally executing a file with the .bat extension. For instance, if you have a file called work.exe , and you create work.bat in the same directory, your batch file will not execute unless you type the filename extension as well.

You can create and execute batch files from the current directory or any directory in your search path, or by specifying their complete pathname, as with any other command. But if you're going to use batch files a lot, it makes sense to keep them all in one place. Create a directory called \ Batch and add it to your search path. See "path", earlier in this chapter, for details.


6.5.2. Some Rules of the Road

Here are the basics of batch file programming:

  • Each command in a batch file must be on a separate line. The last command line in the file should end with a carriage return. The commands are the same as you'd type in succession at the command prompt.

  • The name of the batch file itself is stored in the variable %0 . This allows you to do things like have a temporary batch file that deletes itself when done. The name is stored as it was typed at the command line, so if you had typed myfile.bat , %0 would be myfile.bat , but if you had typed c:\batch\myfile , %0 would be c:\batch\myfile .

  • A batch file run from the command prompt or by double-clicking on its icon will open a command prompt window while it is executing; however, a batch file run from an existing command prompt window will run inside that window.

  • Click the control menu and select Properties (see Section 6.1, earlier in this chapter, for details) to control the default look and feel of the Command Prompt window. To change these settings for an individual batch file, create a Windows Shortcut to the batch file, right-click the new shortcut, and select Properties.

  • The Properties sheet for the shortcut actually adds several options not normally available through the control menu. For example, Shortcut Start in allows you to choose the initial working directory, and Shortcut Run allows you to have the batch file run minimized. (Note that the option to have the window close or remain open after it completes, found in some earlier versions of Windows, is not present in Windows XP.)

  • You can stop a running batch file by pressing Ctrl-Break or Ctrl-C; the following message will appear in its DOS window: "Terminate batch job (Y/N)?" Press Y to abort or N to continue running the batch file.

  • By default, each command in a batch file is echoed to its DOS window. To execute a command silently, precede it with an @ symbol. Alternatively, you can turn command echo off by issuing @echo off at the beginning of the batch file.

  • A batch file can contain any command that you can type at the command prompt (e.g., anything described elsewhere in this chapter or in Chapter 4). However, keep in mind that each line in the batch file is executed sequentially, so there are a couple of gotchas, especially when the batch file runs programs that pop up a separate window. When you run a Windows program and it pops up its own window, control returns immediately to the batch file and the next line is executed. This "race condition" is unfortunately unavoidable with batch files; you'll have to use a WSH script for this type of control (see Chapter 9).

  • You can store temporary data in your batch file using environment variables created with the set command. To use the value of any variable with any other command or program, surround its name with % symbols.

6.5.3. The "Why" and "When" of Using Batch Files

This section gives a few examples of instances when you might want to use batch files.

Batch files are used to automate repetitive tasks , but can be useful for more than just issuing a sequence of commands. For example, type the names of three applications in a batch file to have them all opened in a single step. Or, write a one-line batch file that copies a directory of files onto a removable drive; instead of performing a copy manually every day before you go home from work, just double-click the batch file icon and it will be done for you.

Batch files are particularly powerful for creating and moving files and directories. For example, when starting a new project, an author might always want to create the same directory structure and put some basic files into each directory. Here's the kind of batch file you might create for this kind of housekeeping:

 @echo off if "%1"=="" goto skip mkdir %1\figures  mkdir %1\sources mkdir %1\old copy c:\templates\mainfile.doc %1 copy c:\templates\other.doc %1 copy c:\templates\image.tif %1\figures :skip 

Create a new folder in the Explorer, and then drag and drop it onto this batch file (or add the batch file to the SendTo menu). Subdirectories called figures , sources , and old will be created inside, and three template files are copied into the new directories. Voil you just saved about a minute of clicking and dragging.

The construct:

 if "%1"=="" go to skip 

is a useful error-checking technique. You can use an if statement to test for null arguments (or other similar conditions), and if encountered , either issue an error message or simply quit. (This example will exit after jumping to the :skip label, since there are no further commands to be executed.)

You can also use batch files to work around some of the limits of Windows XP. For example, the Explorer doesn't let you print out a hardcopy listing of the contents of a folder. You can do this from the command line by typing:

 dir > lpt1: 

But the following batch file does even better you can drag and drop a folder icon onto it to get a printed directory listing:

 @echo off if "%1"=="" goto skip dir %1 > lpt1: :skip 

You could also replace lpt1 : with something like c:\windows\desktop\dir-list.txt to output the directory listing to a text file instead, or construct a loop so that the batch file could repeat itself automatically for multiple directory name arguments.

6.5.4. Variables

Variables can be used in batch files. In fact, a variable that is assigned in one batch file can be accessed by a different batch file (in the same command prompt session), since the command prompt environment is used to store all variables. See "set", earlier in this chapter, for more information on setting, modifying, reading, and deleting variables from the environment.

A batch file can take arguments such as filenames or options. Up to nine arguments are stored in the variables %1 through %9 . For example, the following line in a batch file:

 copy %1 %2 

would mean that the batch file would copy the filename specified in the first argument to the name specified in the second argument. Use this feature in conjunction with the if statementfor example, to display a help screen when the " user " includes the /? option. The %* variable returns a string with all arguments (e.g., %1 %2 %3 %4 %5 ...), which can be a convenient way to pass all a batch file's arguments to another batch file or command.

The following variable operators, a new feature in Windows XP, can also be used with variables containing filenames. They don't actually change the contents of the target variable, but they do return an expanded version of it:


%~ var

Expands % var , removing any surrounding quotes.


%~f var

Expands % var to a fully qualified path name (useful if % var references a file in the current directory).


%~d var

Expands % var to a drive letter only.


%~p var

Expands % var to a path only.


%~n var

Expands % var to a filename only.


%~x var

Expands % var to a file extension only.


%~s var

The expanded path contains short names only.


%~a var

Expands % var to file attributes.


%~t var

Expands % var to the date/time of the file.


%~z var

Expands % var to the size of the file.


%~$ dir : var

Searches the directories listed in the dir variable and expands % var to the fully qualified name of the first one found. If dir is not defined, or the file is not found by the search, then an empty string is returned. If you specify path for dir , the command search path will be used (see "path", earlier in this chapter).

These operators are most commonly used with command-line arguments; for example, use %~z 2 in a batch file to display the size of the file specified by %2 . These operators can be combined; for example, %~nx1 expands %1 to the filename and extension only, and %~ftza7 expands %7 to a dir -like output line. If the variable % var is not defined or does not contain the filename of an existing file, an empty string will be returned.

6.5.5. Additional Commands Used in Batch Files

The following list contains descriptions of the commands that are used principally within batch files. These can be used in conjunction with any of the commands listed earlier in this chapter, as well as the filenames of any command prompt programs or even Windows applications.

call

Invoke a batch file from within another batch file, returning control to the original when the called file completes.

Syntax

 call [   filename   ] [   arguments   ] 

Description

The call command lets you invoke a batch file from within another batch file and wait for it to finish before continuing. Once the called file has completed its execution, the control returns to the original batch file.

If you run another batch file from within a batch file without using call , the control will never be returned to the parent batch file when the child process is finished. The whole thing just quits. Of course, this fact can be put to use; for example, it helps to avoid recursion when a batch file calls itself.


The options for call are as follows :


filename

Specifies the filename of the batch file to call.


arguments

Specifies any command-line arguments to be passed to the target batch file.

Examples

The following parent.bat calls child.bat , and then returns the control back to itself:

parent.bat:

 @echo off cls call child.bat First set first=%inputvar% call child.bat Second set second=%inputvar% echo You typed %first% and then you typed %second% 

child.bat:

 set /p inputvar=Please type the %1 option: echo Thank you. 

In this example, parent.bat launches child.bat twice, which illustrates how you can write modular code in batch files. Child.bat asks for input and then places what the user types into the environment variable inputvar . When control is returned to parent.bat , the variable first stores the input so that child.bat can be run again. At the end, parent.bat spits out both variables.

The next example illustrates how one of the batch file's limitations can be overcome . The if statement, discussed later in this chapter, is only capable of executing a single command, but the following is a simple workaround:

parent.bat:

 @echo off for %%j in (1,2,3,4,5) do call child.bat 

child.bat:

 set /p inputvar=Please type option #%j%: echo You typed %inputvar% - good for you. 

choice

The choice command found in earlier versions of Windows is no longer supported in Windows XP. The set command with the /p option is a suitable replacement.

errorlevel

See "if".

for

Repeat a specified command any number of times.

Syntax

 for [/d] %%   variable   in (   set   ) do   command   [   arguments   ] 

 for /r [   path   ] %%   variable   in (   set   ) do   command   [   arguments   ] 

 for /l %%   variable   in (start,step,end) do   command   [   arguments   ] 

( in and do are not options, but rather simply part of the syntax; if omitted, an error will occur.)

Description

Use this command to create loops in a batch file. A for loop is a programming construct that allows you to repeat a command for a list of items (such as filenames). You specify an arbitrary variable name and a set of values to be iterated through. For each value in the set, the command is repeated.

The options used by for are the following:


command [ arguments ]

The command to execute or the program filename to run. This can be anything you'd normally type at a command prompt; arguments are the options, if any, to pass to the command.


%% variable

A one-letter variable name that is assigned, one by one, to the elements listed in set . Although variable is treated like a standard environment variable (see "set", earlier in this chapter), it's name is case sensitive ( %%j is different than %%J ) and can only be one letter long. Note also the use of two preceding percent signs. If the for command is issued directly from the command prompt (and not from within a batch file), use only one percent sign here.


set

The sequence of elements through which the for command cycles. Elements are separated with spaces and can be files, strings, or numbers . Wildcards can be used when specifying files. See Examples, below, for details. Use the /l option for the more traditional start , step , end . format.


/d

Instructs for to match against directory names instead of filenames if set contains wildcards. Can't be used with the /l or /r options.


/l

Specifies that set takes the form of start , step , end ., allowing you to specify a range of numbers and an increment instead of having to list each element. The /l parameter allows you to mimic the more traditional usage of for found in more advanced programming languages. See Examples, below, for details.


/r [path]

Recursively executes command for each directory and subdirectory in path . If path is omitted, the current directory is used. Without /r , files specified in set only relate to the current directory. The /r option instructs for to "walk" the directory tree rooted at path and repeat the entire loop in each directory of the tree encountered. If set is just a single period (.), for will simply list all the directories in the tree.

Examples

for can cycle through an array of strings:

 for %%n in (rock paper scissors) do echo %%n 

Create a set of numbered directories (e.g., ch1 , ch2 , ch3 , ch4 , and ch5 ):

 for %%n in (1 2 3 4 5) do md ch%%n 

Here's an alternate way to accomplish the same thing, using the /l option:

 for /l %%n in (1,1,5) do md ch%%n 

Here, the first 1 represents the beginning number, the second 1 represents the increment (or step), and the 5 represents the end. Here are some more examples of this syntax:

 for /l %%n in (0,5,100) do echo %%n for /l %%n in (100,-2,0) do echo %%n 

Since the for loop works only for a single command (and it doesn't work well with goto ), you need to do something like this to run multiple commands with for :

 for %%f in (1 2 3 4 5) do call loop1.bat %%f echo done! 

loop1.bat might then look like this:

 if not exist file%1 goto skip copy file%1 c:\backup :skip 

Note how the %%f variable is passed to loop1.bat as a command-line parameter, and is then referenced with %1 .

The set parameter can also contain filenames:

 for %%j in (a.txt b.txt c.txt) do copy %%j a: 

The following statements are equivalent:

 for %%x in (*.txt) do type %%x type *.txt 

While the second example is simpler, it does illustrate a way to deal with programs or commands that don't normally support wildcards.

List all the directories (with full paths) on your hard disk

 for /r c:\ %%i in (.) do echo %%i 

Copy all .doc files in all subdirectories of c:\Documents and Settings to drive D :

 for /r "c:\Documents and Settings" %%i in (*.doc) do copy %%i d: 

Notes:

  • When redirecting the output of a for loop to a file, you'll want to use >> (append to a file) rather than > . Otherwise, you will save only the last iteration of the loop.

  • The commands executed by the for statement will be echoed to the screen unless you issue the @echo off command beforehand or precede command with @ . See "echo", earlier in this chapter, for details.

  • The for command also supports the rather arcane /f option; type for /? at the command prompt for more information.

goto

Branch to a labeled line in a batch program.

Syntax

 goto   label   

 ... 

 :   label   

 GOTO :EOF 

Description

goto is typically used with the if statement to branch to a particular part of a batch file, depending on the result of the condition or user response.

Label , any string of text (no spaces) following a colon , marks the beginning of a section of a batch file and represents a target for the goto command. Only the first eight characters of label are used; the labels pneumonia and pneumonic are therefore equivalent. If you type goto :eof (note the colon, not normally used here), it will skip to the end of the batch file ( EOF =end of file).

If your batch program doesn't contain the label you specify after goto , the batch program stops and displays the message "Label not found." However, you can specify labels that don't appear in goto commands.

Examples

Format a floppy disk in drive a: and display an appropriate message of success or failure:

 @echo off format a: if not errorlevel 1 goto skip echo An error occurred during formatting. exit :skip echo Successfully formatted the disk in drive a! 

See Also

"if"

if

Execute a command if certain conditions are met.

Syntax

 if [not]   string1   ==   string2     command   [   arguments   ] 

 if [/i]   string1 compare-op string2     command   [   arguments   ] 

 if [not] exist   filename     command   [   arguments   ] 

 if [not] errorlevel   n     command   [   arguments   ] 

Description

Conditional branching lets your batch file test to see whether a condition is true, and if it is, instructs the batch file to execute a command or continue execution at another location in the batch file (via the goto command). The following options can be used with the if command:


command [ arguments ]

The command to execute or the program filename to run. This can be anything you'd normally type at a command prompt; arguments are the options, if any, to pass to the command.


not

Specifies that command should be carried out only if the condition is false; not valid with compare-op .


string1 == string2

Specifies a true condition if the specified text strings match. String1 and string2 must be enclosed in quotation marks or parenthesis.


string1 compare-op string2

Performs a more flexible comparison than string1 == string2 , shown above. The compare-op term can be one of the following:


EQU

Equal


NEQ

Not equal


LSS

Less than


LEQ

Less than or equal


GTR

Greater than


GEQ

Greater than or equal


/i

Specifies a case-insensitive comparison; used only with compare-op .


exist filename

Specifies a true condition if the specified file exists.


errorlevel n

Specifies a true condition if the previous command or program returned an exit code equal to or greater than the number specified. Zero typically means no error; other numbers depend on the command or program.

Examples

Since batch files can accept parameters (stored in %1 , %2 , %3 , and so on); the if statement is vital to interpreting these parameters. The following statements might appear at the beginning of such a batch file:

 if "%1"=="" echo You didn't specify a parameter if "%1"=="/?" goto help if "%1"=="hullabalooza" goto doit 

The following statements are equivalent:

 if not "%1"=="" echo You must've typed something. if "%1" NEQ "" echo You must've typed something. 

The following batch file checks the current directory for the file form.bat . If it finds it, the message "It exists!" is displayed, and if it doesn't, "The file doesn't exist" is displayed:

 @echo off if exist form.bat goto jump goto skip :jump echo It exists! pause exit :skip echo The file doesn't exist. pause exit 

When a program exits or a command completes, it returns an integer value to the operating system called the errorlevel . Typically, errorlevel is zero ( ) if the operation was successful or a higher number if there was a problem. The if errorlevel statement checks if the errorlevel value is equal to or greater than a specified number:

 find /i "xp" c:\stuff\tips.txt if errorlevel 2 goto error if errorlevel 1 goto nomatch if errorlevel 0 goto match :match echo A match was found! goto end :nomatch echo Sorry, but a match wasn't found. goto end :error echo Ack! An error has occurred! :end pause 

Note that the if errorlevel statements are ordered so that higher numbers are checked first; if the order was reversed , the first one ( if errorlevel 0 ) would always return true since the errorlevel is always greater than or equal to zero.

It's also important to account for the possibility that none of the if statements will encounter a true condition; in the example above, if all errorlevel checks failed, execution would simply continue onto the :match section.

The if statement also supports else , but the syntax is very strict. else must be the first word on the line immediately following the if statement, like this:

 if exist %1 del %1 else echo Sorry, %1 was not found 

Batch files in Windows XP also support if...else blocks, like this:

 if exist %1 (echo I'm about to delete %1.  Are you sure?    pause    del %1) else (echo I couldn't find %1.  To bad for you.    exit) 

The indenting here isn't necessary, but it does make the code easier to read. Note the opening and closing parentheses used to enclose the blocks, and the fact that else must be on the same line as the closing parenthesis of the first block and the opening parenthesis of the second block.

See Also

"for", "goto"

pause

Suspends processing of a batch program and prompts the user to press any key to continue.

Description

Include the pause command whenever you want your batch file to stop and wait for user input, giving the user a chance to read the text on the screen, insert a floppy disk, or press Ctrl-C to abort the batch file.

The message "Press any key to continue..." is automatically displayed whenever the pause command is used; it is not affected by the echo off statement.

Examples

Prompt the user to change disks in one of the drives in a batch program:

 @echo off echo Insert next disk in drive A, and pause 

When this batch file is executed, the following message will appear:

 Insert next disk in drive A, and Press any key to continue ... 

Something like this is also common:

 @echo off echo Press Ctrl-C to cancel, or pause 

rem Internal to: \Windows\command.com

Insert comments ("remarks") into a batch file. Lines beginning with rem will be ignored when the batch file is executed.

Syntax

 rem [   comment   ] 

Description

The comment can say whatever you want. It's a good idea to put comments in your batch file so that others (including you in the distant future) can figure out how it works.

The rem command is also useful for disabling commands. Just add rem right before the command to disable it.

Examples

A batch file that uses remarks for explanations and to disable a command:

 @echo off rem This batch program may one day change a directory. rem But not until I remove the rem before the cd command. rem It is called mydir.bat. rem cd \batch\ch2 

This example, if executed, would do absolutely nothing.

See Also

"echo"

shift

Delete the variable that holds the first command-line argument ( %1 ) and shifts over the remaining arguments.

Syntax

 shift 

Description

Use the shift command when you want to cycle through all of the command-line arguments specified when the batch file was run. When a shift statement is encountered, the value stored in %2 is assigned to %1 , the value stored in %3 is assigned to %2 , and so on. The value stored in %1 before the shift statement is lost. This is particularly useful when processing loops.

Examples

In the following batch file, shift is used so that each of the command-line options becomes option #1 ( %1 ) for processing within the loop. The beauty is that this works regardless of the number of arguments entered:

 @echo off rem MTYPE.BAT rem example: mtype foo.txt bar.txt *.bat :loop if "%1"=="" exit for %%f in (%1) do type %%f shift pause goto loop 

The if statement tests for an empty argument (meaning that shift has exhausted the supply of arguments) and ends the loop when found.

Notes

  • Normally, the number of command-line arguments is limited to nine ( %1 tHRough %9 ), but shift makes it possible for a batch file to accommodate more.

  • If you use a wildcard on the command line, it is passed to the batch file as a single argument (e.g., *.*), which can be used as is. It isn't expanded first, as with Unix shells , so you can't pick it apart in the script and use each matched filename separately.



Windows XP in a Nutshell
Windows XP in a Nutshell, Second Edition
ISBN: 0596009003
EAN: 2147483647
Year: 2003
Pages: 266

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net