
                          Intermediate .BATch Tutor
                                    -by Barry Simon


         (c) Copyright 1986 by Capital PC User Group, Bethesda, MD.

[Editors  note:   This  article was published November, 1986 in the "Monitor"
published by the Capital PC User Group.  Material may be reproduced only  for
internal use by other not-for-profit groups.]



One of the tools that most distinguishes the experienced DOS user from others
is the effective use of BATch files.  In this article, I will discuss some of
the  more  advanced  features of BATch files and their commands.  I call this
tutorial "intermediate" because I have tried to write in a manner  accessible
to those with only a little experience writing BATch files.


               ------------[ Simple BATch files ]------------

To begin with, a BATch file is a set of DOS commands which you place together
and which you can issue by just typing the  name  of  the  BATch  file.   The
classic  example  is the BATch file which changes to the directory containing
Lotus' 1-2-3 and then runs 1-2-3.  The same idea can be carried much further:
for example, when I execute my word processor with a batch file, it

   -- loads the proper set of macros in my keyboard macro program;

   -- makes a mark using Kokkennen's MARK/RELEASE package;

   -- loads my thesaurus;

   -- loads the appropriate mouse menu program;

   -- runs the word processor, and

   --  after I am finished with the word processor, clears the macros and
       runs RELEASE to boot the thesaurus and mouse menu from memory.

BATch  files must be pure ASCII text files with separate commands on distinct
lines separated by carriage return/line feed pairs.   To  create  your  BATch
files,  you can use EDLIN, a text editor, or any word processor that produces
straight ASCII text files.

BATch programs can contain DOS commands, application program commands,  or  a
variety of specialized programming features that are known as BATch commands.



           ------------[ BATch Commands and Features ]------------

Parameters......

Your  text  editor may allow you to specify a text file to use as a parameter
on the command line loading it.  You would like to specify the file name as a
parameter  on  the command line calling a BATch file to start your editor and
have this file name passed on to the editor when it is loaded.  This is quite
easy.   If  your editor is called EDITOR.EXE and you load it via a BATch file
called foo.bat, you need only make the line calling the editor say:

               editor %1

and then call up the BATch file as

               foo filename

When the BATch processor comes to the %1, it looks for  the  first  parameter
following  "foo" and replaces %1 by that parameter, in this case by filename.

To be more precise, DOS parses the command line calling the BATch  file  into
distinct "words" separated by one of four delimiters:

               <space> , ;  =

That  is, it looks for strings of allowed characters separated by one or more
of these special four.  Any of the 256 ASCII characters are  allowed  in  the
strings  except  for  these four delimiters, the three redirection characters
(<,>,|) and the ASCII nul.  The first word on the command  line  is  assigned
the  value  %0, the next %l, etc.  Normally, %0 is just the name of the BATch
file but since "." is not a delimiter in parsing the line but is a  delimiter
in ending file names, if you have a BATch file foo.bat and type in

               foo,cpcugisgreat

foo.bat will be run and %0 will have the full 17 character string assigned to
it.  Similarly,  since  DOS  knows  that  file  names  are  no  more  than  8
characters, the BATch file 12345678.bat  will be run if you type in

               12345678ABCDEFGHIJ

but  %0  will  have an 18 character string.  These are admittedly curiosities
but DOS curiosities have a knack of being useful sometimes.  In a real sense,
DOS  assigns  as  many parameters as there are words on the command line, but
initially you can only access the first ten as %0 through %9.  Any place that
%1  appears in the BATch file except as %%1, it will be replaced by the first
word after the filename even if that word is the empty word.  Any other  time
that  the  symbol % appears in the BATch file, DOS will strip the %-sign away
except that %% is replaced by a single percent  and  %%1  becomes  %1  so  if
foo.bat has the single line:

               echo %%1 has the value %1

then typing

               foo junk

will issue the message

               %1 has the value junk

There  is  no  limit  on  the size of any individual parameter other than the
overall limitation that the entire DOS command line can contain no more  than
a total of 128 characters.

To  summarize:   any time %i (for i=0,1,...,9) occurs in the file except as a
%%i, it will be replaced by the ith string in the command line.

The real limitation of BATch file parameters is that they are not variables.
You cannot manipulate them by parsing them and cannot change their values.


Labels......

As a preparation for discussing BATch file GOTO commands, I need  to  discuss
labels.   Any  line  beginning  with the character ":" will be skipped by the
BATch processor when it gets to it.  This means that you can use  such  lines
as  remark  lines  which will not appear on the screen even if echo is on (in
which case lines beginning with rem do  appear).   You  can  also  place  the
redirection  characters  <,>,|  on  such  a  line  (but you cannot place such
characters on a "rem" line).  And % signs are not treated specially  on  such
lines.

While DOS ignores such lines, the string following the :  becomes a label for
the GOTO command which I'll discuss next.  The first word or the first  eight
characters  of  the  first  word become the name of that label.  You can also
place comments after a label name if  you  separate  these  comments  with  a
space.


GOTO......

The  most significant way in which BATch files go beyond the DOS command line
concerns two logical control structures, the GOTO and the IF  commands.   The
line

               goto <label>

will  send the BAtch file to the line immediately following the line on which
the label appears.  If the label appears more than once, its first appearance
in  the  file  is  used.  If the label does not appear, the processing of the
BATch file is abruptly ended with the message "label not found."

GOTO's can be used for either branching or some rather crude  looping.   Here
is  a  simple  example  of  branching.  Suppose that you wish to send control
codes to your printer easily from the DOS command line.   You  might  prepare
little  files  like  ff.txt containing a formfeed (control- L), or boldon.txt
with the codes for turning bold  face  on,  etc.   Then  you  could  write  a
print.bat file which began:

               goto %1
               :ff
               copy ff.txt prn
               goto end
               :boldon
               copy boldon.txt prn
               ETC

with a label ":end" as the last line of the file.

One  problem  with the limited logic allowed by BATch files is the difficulty
of error checking.  With the above, if you forget to put in  a  parameter  or
put in an illegal value, you would get the rather inelegant "label not found"
message.  Alternatively, you could replace the "goto %1" with separate  lines
such as:

               if %1 = = ff goto ff

and then place an error message, hardly a neat solution.


PAUSE......

The  next  BATch command that I'll discuss, PAUSE, unlike GOTO and paramaters
makes sense at the DOS  command  line.   For  straight  DOS  usage,  this  is
pointless  but  for  environments like CED or TallScreen which allow multiple
commands on one line, it can be useful.   What  PAUSE  does  is  display  the
message:

               Strike a key when ready ...

and pause the processing of the BATch file until a key is struck.  Before the
message  is  displayed,  the  keyboard buffer is flushed to prevent any stray
keystrokes left over from previous operations from bypassing  the  effect  of
the PAUSE command.

There  are  three  rather  distinct uses of the PAUSE command.  The most well
known is to allow the user to take an action like inserting a diskette into a
drive.  Often, you will want to echo a message to the screen before the PAUSE
command such as:

               echo Place a diskette into drive B: and ...
               pause

A second use is to allow the user to see the output of  some  program  before
the  BATch file continues.  Without the PAUSE, the output might disappear too
quickly to absorb.  A third use that we'll see later is  an  extremely  crude
device for user input.


The IF Command......

The  second  and  last  element  of  flow  control  provided by DOS is the IF
command.  Like pause, it also makes sense  at  the  DOS  command  line.   The
syntax is

               IF (not) <comparison> <consequence>

The not is an optional part which we'll explain later.  Comparison is limited
to three types:

   -- A test for the equality of two strings;

   -- A test for the existence of a file;  and

   -- A test of the "error level."

If the comparison is true, then the command in "consequence" will get carried
out.  If the word "not" is included, then <consequence> is carried  out  only
if  the  comparison  fails.  While consequence is typically a GOTO statement,
any acceptable DOS or BATch command  is  allowed.   You  can  even  have  the
consequence be a second if statement as in

               if not %1 = = ff if not % 1 = = boldon goto error

As  the  last line shows, the syntax for checking strings is to use two equal
signs.  Strings are  sequences  of  characters  not  including  the  standard
delimiters  (space,  comma,  semicolon or equal) or redirection signs.  These
redirection signs but not delimiters can appear if the string or part of  the
string  is  surrounded  by  single or double quotes.  If an illegal string is
used, DOS will reward you with "bad command or filename." There is a standard
problem faced by users first exposed to BATch files.  Often, you will want to
test for an empty string, for example to give an error message  if  the  user
failed  to  provide  a necessary parameter.  Empty strings are not allowed so
that the line

               if %1 = = echo whoops

will yield "syntax error" if %1 is empty, and "bad command or file- name"  if
%1  has  the value "echo" unless of course you have a program named "whoops."
The way out of this problem is to use the fact that %1 is  replaced  wherever
it is and add a dummy parameter as in

               if a %1 = = a echo whoops

The  possibility  of looking for a file provides essential error checking.  A
common example of its use is to fix the deadly move BATch file:

               copy %1 %2 \ %1 erase %1

This may seem like a great way of moving a file from one directory to another
so that

               move foo.txt C:  \ junk

will move foo.txt from the current directory to junk.  But if  the  directory
junk  doesn't  exist,  the  first  line  will give the error message "Invalid
directory" and the second line will erase the file which has NOT been copied.
Thus, as a protection you should add before the "erase %1" line

              if not exist %2 \ %1 goto end

with  an  appropriate  label  and error message.  There are many other places
where such error checking can be invaluable.  Unfortunately, "if exist" works
with path names only in DOS 3.x and not in DOS 2.x.

The final if comparison, "if errorlevel," is useless within  the  context  of
pure DOS commands since no DOS command (before DOS 3.2) sets errorlevel.  But
the DOS technical reference describes how a program can  set  this  parameter
and if you have a program that sets it, this comparison is useful.

But I must warn you that the comparison

               if errorlevel 2

is  TRUE  not only if the value of errorlevel is 2 but if it is 2 or greater.
Beginning with DOS  3.2,  several  external  DOS  commands  such  as  BACKUP,
RESTORE,  and  FORMAT set what the DOS manual calls "exit codes" which can be
tested with "if errorlevel."


Nested and Chained BATch Files......

It is possible to make rather elaborate collections of BATch files which call
one  another.   The  simplest  is  the  equivalent of a GOTO.  If the name of
another file appears as a line in one BATch file, the BATch file  will  begin
and you will NOT return to the first BATch file when the second one ends.

Particularly  since the BATch control structures (GOTO and IF) do not include
CALL/RETURN processing of subroutines, one would like to be able  to  call  a
second BATch file as a subroutine and return to the first BATch file when the
second one finished.  Many books, especially the older ones,  will  tell  you
that  this is not possible.  However, in DOS 2.x and later, there is a method
of doing precisely this kind of subroutine  call.   This  is  an  example  of
something  which is not undocumented but rather so badly documented that many
experts did not realize its potential until some time had passed.  The reason
that an ordinary call to a second BATch file does not return you to the first
is that COMMAND.COM is only able to  keep  track  of  one  BATch  file.   The
solution  is  to  load  a secondary copy of COMMAND.COM to process the second
BATch file.  The correct syntax is

               command/c foo

to call foo.bat from another BATch file.  When foo ends,  processing  of  the
first BATch file will continue on the next line.

Several  warnings are in order concerning this command.  As you may know, DOS
has both internal commands like COPY and external commands like FORMAT.  That
is,  once  COMMAND.COM  is  loaded  during  initial  bootup,  COPY becomes an
available command while FORMAT is a stand alone program  provided  separately
on the DOS disk, which must reside in the default directory or in the path to
be available in the user.  You might  think  that  COMMAND  was  an  internal
command but it is external.  That is, in order for a line like

               command/c foo

to  work,  COMMAND.COM  must  be available in the default directory or in the
path.  In addition if you leave an old version of  COMMAND.COM  somewhere  on
your  hard  disk and that happens to be the one first found when this line is
processed, you will get a message "incompatible DOS versions." Finally, there
is  a  warning about the SET command discussed in the section below on global
variables.


FOR...IN...DO

FOR...IN...DO is one of DOS' most powerful and  least  appreciated  commands.
It  can  be  used  at  the  DOS command line or in a BATch file with slightly
different syntax.  The syntax at the DOS command line is

               for %a in (<list>) do expression (%a)

The  use  of  a  in %a is not important;  you can use any letter or number or
even extended ASCII code so long as it appears  in  all  places.   The  %  is
important  and since %'s get stripped from BATch files, the syntax in a BATch
file must be "for %%a...".  The keyword "do" must appear or you  will  get  a
"syntax  error"  message.   Within  the () can appear a list of ASCII strings
separated by the standard delimiters.  Following the keyboard "do" can be any
command  with  %a  as  a parameter which will be successively replaced by the
values listed within ().  For example

               for %a in (file1 file2 file3) do copy %a prn

will issue three separate commands copying the three files to prn.

The power of the FOR...IN...DO construction comes  because  you  can  include
wildcards  and  DOS  will  substitute  in  turn  each filename satisfying the
wildcard, so for example.

               for %a in (file?) do copy %a prn

would do the same thing as the above command if there  were  no  other  files
with the name file?  Therefore, the greatest use of FOR...IN...DO is to force
programs which don't understand wild cards to understand them  none-the-less!
For  example,  when  I  discussed  file viewers, I talked about both LIST and
FILEVIEW.  LIST allows you to give wildcard filenames  so  "list*.doc"  would
successively  view  all  files  with a doc extension.  FILEVIEW does not have
this built in but you can do it yourself:  rename fv.exe fv@.exe and  make  a
one line BATch file called fv.bat saying

               for %%a in (%1) do fv@ %%a

and suddenly FILEVIEW also has this capability.

You  can also force commands which don't treat wildcards "properly" to do so.
For example, if you want to change the date/time stamp on a file foo.  txt to
the current date and time, the command

               copy/b foo.txt+,,

will  do  precisely  that.  If one replaces "foo.txt" in the above command by
*.*, DOS will create one file which is the combination of each  file  in  the
current  directory,  probably not what you intended.  To change the date/time
of all files use

               for %a in (*.*) do copy/b %a+,,

You can combine multiple commands and wildcards as in

               for %a in (*.pas*.com) do copy %a A:

If  you want to stop such a command before it has run its course, Ctrl-C will
give you the opportunity to break the loop.  In addition you should be warned
that  a  FOR...IN...DO  loop  is like a BATch file;  if the expression called
after the keyword "do" involves a BATch file, processing will not  return  to
the  FOR...IN...DO loop.  It will only be processed one time even if you have
several possibilities in your list.  As  happens  for  BATch  files,  placing
command/c will prevent the chain breaking so

               for %a in (*.*) do command/c foo %a

issued at the DOS command line would run the BATch file foo.bat  successively
with each file in the default directory as a paramter.

The  BATch  processor  is  rather inefficient.  It reads only one line of the
file into memory at a time (try including a line like "erase  foo.bat"  in  a
BATch  file  to see what happens) although it keeps its place by counting the
byte offset (try using your editor on foo.bat as a line in foo.bat to explore
this).  By using the FOR...IN...DO command to reduce the number of lines in a
BATch file, you can  speed  up  processing  by  a  noticeable,  although  not
spectacular,  amount  (perhaps by 10%).  For example, if you have a large RAM
disk and routinely copy several directories to it during bootup try:

            for %%a in (path 1 path 2) do copy %%a \ *.* D:  >nul

Two warnings about this procedure:  you cannot include a command with its own
parameters in the list since DOS processes the list in () one word at a time.
Second, for technical reasons, I strongly recommend against loading  resident
programs in such a statement.


SHIFT......

As I described above, when DOS parses the input command line to a BATch file,
only the first 10 words are available as %0 to  %9.   However,  DOS  keeps  a
record  of the entire line.  One of the things that the SHIFT command does is
provide you with access to the other parameters.   A  line  with  the  single
command  SHIFT drops %0 changes %1 to %0,..., %9 to %8 and makes what was the
eleventh word on the original command line into the new %9.

Additional calls to SHIFT repeat this process.

If SHIFT were only good for accessing parameters beyond the initial ten, it
would be of limited use.  I cannot find any interesting use of this aspect of
the command.  Its real use lies in the possibility of having a real loop
within a DOS BATch file.  Here is a sample "touch.bat" expanding the one line
procedure for updating the date/time stamp of a file:

               :top
               if %1x=x goto end
               for %%a in (%1) do copy %%a+,,
               shift
               goto top
               :end

With this BATch file, you can issue the command  touch  followed  by  several
parameters, each with wildcards.  The basic operation is applied to each file
meeting any of the filespecs listed as  parameters.   Of  course,  you  could
probably do just as well with the single line.

               for %%a in (%1 %2 %3 %4 %5) do copy %%a+,,

While  I  can  develop considerable enthusiasm for the FOR...IN...DO command,
SHIFT does not evoke much excitement!


ECHO......

Next, we turn to the issue of  displaying  information  on  the  screen,  the
primary  method  of  communication  between  the writer of BATch file and the
user.  Even if you are writing BATch files for yourself, it  pays  to  expend
some  effort  in  making attractive, instructive displays.  By default, every
line in the BATch file appears on the screen.  While this has  the  potential
advantage  of  showing  the  user what is going on, usually the display is so
fast that it is more distracting than useful.  You can turn off the automatic
display of commands to the screen with the command.

               echo off

When echo  is  off,  you  can  display  messages  by  preceding  the  desired
communication  with  the  keyword ECHO.  The default for BATch file should be
echo off and there are patches for COMMAND.COM to make that the  default.   I
have avoided this patch because such a patch is not immediately available for
new versions of DOS.  Unless you make this patch, most of  your  BATch  files
should begin with

               echo off
               cls

It is not necessary to turn echo on before  exiting  a  BATch  file;   it  is
turned  back  on automatically.  You can suppress the prompt on a DOS command
line by typing "echo off" at the DOS prompt and then "echo on"  is  necessary
to restore the default.

ECHO  can  be a useful command.  Its message is sent to standard output which
means that you can redirect it and so use it to send codes to  your  printer.
But be warned that a CR/LF pair is always appended to an echo line so

               echo ^L>prn

(where  ^L means control-L the form feed character) will not send only a form
feed to your printer, it will send an extra line feed.  Also, you will not be
able  to  send  escape  codes to your screen or printer directly from the DOS
command line.  DOS reacts to your <Esc> key by aborting the  current  command
instead  of placing an escape character at the cursor.  With many editors you
can put escape characters into a file and so write BATch files to send escape
codes to the screen or printer.

One  character you may want to use is ^G (Control-G entered by depressing the
control key and hitting g).  This is the "BEL" character and will  beep  when
sent to the screen.  So

               echo ^GYou made an error

will catch the user's attention.  But please control yourself:  avoid putting
several ^G's together.  And with most printers

               echo ^G>prn

will beep the printer.

A famous problem is how to use ECHO  to  make  blank  lines.   A  BATch  file
command  line  with the single word "echo" will not work as this will get the
response "echo is on" or "echo is off".  DOS 2.x  had  a  celebrated  undocu-
mented  feature:   "echo<space>"  did produce a blank line by relying on this
undocumented feature caused grief when DOS 3.x  gave  the  "echo  is  on/off"
response.  Some vesions of DOS have had

               echo .

(note  the  period) produce blank lines but this has not always been true and
had led to some rather fancy programs with installation files showing bunches
of  dots  on  the screen.  There is a rather simple solution.  To get a blank
line try

               echo <char 255>

where <char 255> means including the character  with  ASCII  code  255.   You
can't enter this in all editors but in many (e.g.  EDLIN), you can by holding
down the <Alt> key and hitting 2 5 5 on the numeric keypad.  Lest you be wary
of  using  an  undocumented  feature  of DOS, this trick merely relies on the
documented feature of "echo" to send any  character  even  those  with  codes
above  128  to  the screen:<char 255> is a blank character.  You can also use
one of these characters to anchor down a message that you don't want to start
in column one.

Even  if  echo  is  off,  the  last line in the BATch file will appear on the
screen if that line does not end in a carriage return /line feed  pair.   For
this  reason,  you  will probably want to be sure that the last lines in your
BATch files have such a CR/LF pair at the end.  The exception is if the  last
line is "cls".  In this case the echo to the screen is unimportant and adding
a CR/LF will sometimes place the prompt on line three instead of line two.


                 ------------[ Using ANSI.SYS ]------------

If you are writing for a "mass market," you cannot assume that  the  user  of
your  BATch  files has ANSI.SYS installed but if you are writing for yourself
or for a colleague, you can be sure it is  installed.   ANSI.SYS  provides  a
simple  way  of controlling colors and, to get really attractive screens, the
location of messages.  You  should  consult  your  DOS  manual  (or  the  DOS
technical  reference  for  DOS  3.x)  to  learn  how to move the cursor.  For
example, if you want to start with echo off and  then  only  erase  the  line
"echo off" without clearing the whole screen, try:

               echo off
               echo <esc>[A<esc>[K


             ------------[ Input the Inelegant Way ]------------

One  of  the weaknesses of the DOS BATch processor is its inability to accept
input from the user.  This is of importance not only when writing for others.
You  might  want  a BATch file to run a program and then ask if you wanted to
make a backup.  Of course, if you knew the answer to this backup question  in
advance  you could write the BATch file to get such input as a parameter when
the BATch file was loaded but there is no simple way to get  input  once  the
BATch  file  is running.  The best way to overcome this lack is to use one of
the programs I'll be discussing in later articles in this miniseries.   Lack-
ing  that,  I  know  of two methods to get user input just using DOS's tools.
First, Control-Break (or Control-C) will stop a BAtch file (or rather give yo
the  message  "Terminate  Batch  file(y/n)?") and so you can point out to the
user the option that is always available any ways.  For example,  if  backing
up is all that is left you could put in the lines:

               echo To prevent backup hit Control-Break;  otherwise
               pause

Since you can accidentally brush a key, this is hardly an ideal solution.

Also, you can end a BATch file by displaying a  menu  with  choices  labelled
"a,b,c"  and  have BATch files called a.bat, b.bat, c.bat to run depending on
the user's response.


                ------------[ Global Variables ]------------

If  you chain or nest BATch files, it is easy to pass parameters between them
by putting the parameters in the command line calling the second BATch  file.
But  what  about BATch files called at different times.  For example, you may
have noticed that the a.bat,...  procedure above seems  to  have  the  disad-
vantage  that  you  can  only  use  it  for one menu unless you use different
directories or different letter choices.  Wouldn't it be better if there were
a  place  to  put  "global  variables"  so  you could set menuchoice=1 before
displaying a menu and have a.bat do different things depending on  the  value
of  "menuchoice".   Well,  DOS has precisely such global variables although a
part of the procedure is undocumented.

When COMMAND.COM is initially loaded, it sets aside a  region  of  memory  as
"the environment" which by default is 160 bytes.

The  environment  is  intended  primarly to store the location of COMMAND.COM
when its transient portion needs to be  loaded,  your  path  and  prompt  and
information  that  the  user  can provide various programs.  However, you can
also use it to store global variables for communication  between  your  BATch
files.

Placing  information  into  the environment is a documented DOS command.  You
use SET.  Thus

               SET Name = string

will define a global variable "name" to have the value "string".   As  usual,
"name"  doesn't distinguish between lower and upper case;  if you look at the
environment by typing "SET" with no parameters, the variable will appear as

               NAME = string

Upper and lower case are distinguished in strings.  Notice also  that  spaces
count so that the command

               SET name = string

will define another variable "NAME" (note the space).

Getting  the value of a global variable is easy from within a BATch file.  If
a name appears between percent signs, then DOS will replace the string %name%
by  its environmental value.  Thus if you issued "set foo=fun" and later have
a line like

               if %foo%=fun goto success

then the BATch file will go to the label success.   If  foo  has  no  current
value, %foo% is replaced by the empty string.  Several warnings are in order.
First, this procedure is undocumented.  However, it has  been  constant  from
DOS  2.0  through  3.2 and is so close to a documented procedure available to
programs that it is as likely to remain  in  DOS  as  anything  that  is  not
documented.   Second,  while  you can use the SET command to define variables
whose names have spaces in them or whose name  begins  with  a  numeral,  you
cannot use %name% to access such variables.

A  final  warning.   If you use a command/c to nest a BATch file, DOS makes a
copy of the environment for the new shell that runs the  nested  BATch  file.
Anything  in  the  original environment is in the new one so gloval variables
are available in the new shell.  However, any changes made  in  the  environ-
ment  by  the  nested  BATch  file  via  a  SET command are only saved in the
secondary environment and will be lost when you return to the original  BATch
file.

What  are  global  variables good for?  I have placed today's date in English
(that is January 1, 1980 rather than 1-1-80) in my environment a  bootup  and
then I have a letter.bat which makes a copy of a template with my address and
my word processor's formatting command and I append to this copy via

               echo (char 255)      %date% >>%1


                  ------------[ Key Stacking ]------------

Wouldn't you like to call up TURBO PASCAL in a BATch file which automatically
answered  Y to the opening question, hits W, supplies the name of a file that
you passed to the BATch file as a parameter and then  hit  E  for  edit?   Or
wouldn't  you  like to have a key struck automatically in response to the IBM
logo and "hit any key to continue" at the start  of  so  many  IBM  programs?
BATch  files need a command that lets you prestack some convenient strokes in
the keyboard buffer.

However, there is one crude way of providing keyboard input with DOS tools if
you  can provide all the required input in advance.  For example, if you want
an "erase*.*" command in a BATch file and  would  like  to  avoid  having  to
answer  "are  you sure(Y/N)?", prepare a file, "yes.txt" with the single line
"Y" (and including a CR/LF) and place the line

               erase *.* <yes.txt

in the BATch file.  Two warnings are in order  here.   Be  sure  you  have  a
complete  set of responses or else your system will hang.  In response to the
"are you sure," you must respond Y followed by <Enter> so  if  you  left  the
CR/LF  out  of  yes.txt,  "erase"  would  patiently  wait for the <Enter> and
wouldn't take it from the keyboard since you told it to only take input  from
yes.txt.   Second,  you cannot redirect input and output to a BATch file as a
whole but you can redirect input or output  of  individual  commands  if  the
commands use standard I/O.  Thus, you cannot make a file, 2yes.txt.  with two
yes  liens  and  a  foo.bat  with  two  lines  saying  "erase  *.*"  and  use
"foo<2yes.txt." Foo will still insist on input from you.


                     ------------[ Summary ]------------

BATch  commands provide the end user with a powerful set of programming tools
to develop custom and innovative solutions for everyday computer needs.

In future articles, I will describe some programs that can be used to enhance
the BATch commands and further extend and improve this convenient programming
tool.

                              [end of article]

