Batch Copying Improvement
(PC Magazine Vol 3 No 25 Dec 25, 1984 User-to-User)
COPYNEW.BAT copies files selectively from one drive to
another if the files to be copied are not on the targeted drive.
COPYNEW verifies that the source and target drive designators
have been entered and that they are not the same.
To copy all of the files from the disk in drive A: that are
not already on drive C:, you would type (at the DOS A> prompt):
COPYNEW A C
and hit the Enter key. You omit the colons after the drive
letters; the batch file puts them in for you.
echo off
rem This program copies files selectively from one drive to
rem another only if the file is NOT on the target drive.
rem The syntax is:
rem copynew x y
rem where x and y are the source and target drives. Note
rem these are entered like x and not like x:
rem
if x%1 == x goto error 1
if x%2 == x goto error 2
if %1 == %2 goto error 3
echo on
%1:
for %%f in (*.*) do if not exist %2:%%f copy %1:%%f %2:%%f
goto end
:error1
echo Source drive name missing
goto end
:error2
echo Target drive name missing
goto end
:error3
echo Source and Target drive names can't be the same
goto end
:end
echo on
-----------------------------------------------------------------
Batch Test for Empty DOS Variable
(PC World Nov 1984 The Help Screen)
An on-line help system consisting of several ASCII files
with a full screen of information on a particu-lar command, can
be developed. A batch file called HELP.BAT calls up the screens.
The ASCII files are straightforward. Each should be given the
name of the corresponding command and the extension .HLP; for
example, COPY.HLP gives information on the COPY command.
HELP.BAT is also straightforward. Its only instruction
(other than coloring the screen to identify a "help" screen) is
TYPE %1.HLP. A HELP file can also be included which explains how
to use the help facility. Including the HELP file requires that
HELP.BAT be prepared as:
if exist %1.hlp goto does
if x==%1x goto help
echo Help unavailable for %1
goto end
:does
type %1.hlp
goto end
:help
type help.hlp
:end
-----------------------------------------------------------------
Subdirectory Fixer II
(PC Magazine Vol 4 No 3 Feb 5, 1985 User-to-User)
User-to-User published a trick using TREE.COM, TREEFIX.BAT,
and TREEFIX.BAS to locate files across subdirectories. While the
TREEFIX trio works -- and provides information that DOS does not
-- the FINDFILE.BAT batch file below provides an easier way to
find a file buried deep inside one of your subdirectories.
FINDFILE relies on a little-used feature of CHKDSK.COM, the
/V option. The DOS manual is a bit murky on CHKDSK and most users
don't do much more with this command than see how much space is
left on their disks. The /V option lists all files in all
subdirectories. The DOS 3.0 manual is more helpful both in
explaining the many features of the powerful CHKDSK.COM command.
FINDFILE.BAT first makes sure you have CHKDSK.COM, FIND.EXE,
and MORE.COM on your disk. If you're PATHing to a subdirectory
that contains these files, you should leave out the dozen lines
beginning with the second one ("if exist chkdsk.com ...") and
ending with ":C". FINDFILE then redirects CHKDSK/V into a file
and uses the FIND filter (and the MORE filter if appropriate) to
locate the file in question.
To search for BASICA.COM, for instance, you would type:
FINDFILE BASICA. If you typed: FINDFILE BASIC the batch file
would locate both BASIC.COM and BASICA.COM, and any other
filename with the capital letters BASIC in it. You may also use
parts of names. FINDFILE BASICA would find BASICA.COM. This
comes in handy if you want to look for files with the same
extensions. FINDFILE .COM will list all your .COM files.
Remember to enter capital letters only. And don't put quotation
marks around the filenames or parts of filenames you want to find
-- the batch file will do this for you automatically. FINDFILE
won't display a special message telling you no matches were found
if it comes up empty. But this will be obvious when no matches
are displayed on your screen.
FINDFILE.BAT batch file to locate specific files across all
subdirectories on your disk:
echo off
if exist chkdsk.com goto A
echo PUT CHKDSK.COM on your disk
goto D
:A
if exist find.exe goto B
echo PUT FIND.EXE on your disk
goto D
:B if exist more.com goto C
echo PUT MORE.COM on your disk
goto D
:C
echo NOW SEARCHING DIRECTORIES FOR "%1"
chkdsk /v>--------
find "%1" -------- | more
del --------
:d
rem ...DONE
-----------------------------------------------------------------
Better FIND
(PC Magazine Vol 4 No 7 April 2, 1985 User-to-User)
The FINDFILE.BAT (see article above) is a useful utility.
To make the heart of the program, subroutine :C, more elegant,
use DOS's piping rather than redirection. The 15th line of the
replacement FINDFILE.BAT below replaces the second, third, and
fourth lines in subroutine :C of the original FINDFILE.BAT. With
piping, DOS automatically takes care of creating and deleting the
intermediate files. The new, improved FINDFILE.BAT:
echo off
if exist chkdsk.com goto A
echo PUT CHKDSK.COM on your disk
goto END
:A
if exist find.exe goto B
echo PUT FIND.EXE on your disk
goto END
:B
if exist more.com goto C
echo PUT MORE.COM on your disk
goto END
:C
echo NOW SEARCHING DIRECTORIES FOR "%1"
chkdsk /v | find "%1" | more
:END
REM ...done
-----------------------------------------------------------------
DOS FIND Sieves
(PC Magazine Vol 4 No 8 April 16, 1985 User-to-User)
The DOS FIND filter gives users a fast way to retrieve
information from large databases, document files, programs or any
ASCII file. But there's a way to make it even more useful. This
can be done with the SEARCHUM.BAT file below. If you want to
retrieve from a large client address file called CLIENT.DAT all
cases in which the client is female, lives in Boston and is
self-employed, the command is:
SEARCHUM CLIENT.DAT "female" "Boston" "self-employed"
SEARCHUM.BAT first turns off the echoing of subsequent
command lines to the screen. The first FIND command searches file
CLIENT.DAT (passed as dummy variable %1) for any instance of the
first characteristic, "female", passed via dummy variable %2. All
such lines are written to the first of the SIEVE#.DAT file via
redirection of output along with the sequence line number since
the /N parameter was used with FIND. Then each subsequent command
line searches for the subset of lines in the latest SIEVE#.DAT
file that contains the character string passed to the command
line via the dummy variables.
If no lines contain all the properties that you specify in
the list, then one or more of the later SIEVE#.DAT files will be
empty. Just search back until you find the file with the
information you seek. DOS 2.0 allows up to nine dummy variables
in the list after the command file name. So this method lets you
specify up to eight characteristics in addition to the name of
the file you wish to have searched if you extend the number of
FIND command statements within the .BAT file.
Instead of requiring that all the properties in the list be
present simultaneously, you can structure the .BAT file so that
you can find lines that contain any (i.e., logical OR) of a list
of characteristics and then concatenate the accumulated files at
the end with a COPY command. Or, you can tailor a search to
detect some combination of jointly present and alternative
conditions. On a PC-XT, FIND can readily scan and report the
presence of two instances of a unique character sequence located
in the middle and at the end of a 7,000-line file in about 10
seconds. For ASCII files under a few thousand lines, the response
seems instantaneous.
SEARCHUM.BAT: ECHO OFF
FIND/N %2 %1 > SIEVE1.DAT
FIND/N %3 SIEVE1.DAT > SIEVE2.DAT
FIND/N %4 SIEVE2.DAT > SIEVE3.DAT
Editor's Note: It is possible to save a bit of keystroking by
putting the quote marks in the batch file (e.g., %1" rather than
%1, "%2" rather than %2, etc.) so you don't have to type in the
quote marks when beginning the search, but this works only if
you're searching for single words. And FIND is case-sensitive,
so you have to be sure your database doesn't contain the words
female, Female and FEMALE.
-----------------------------------------------------------------
Clear-Cut TREEs
(PC Magazine Vol 4 No 8 April 16, 1985 User-to-User)
The DOS TREE utility shows the structure of all subdirectories
ies on a disk, but its display is not very clear. The TREEFIX.BAT
file redirects the DOS TREE output to a file, TREE1.LST, which is
then processed by the BASIC TREEFIX.BAS program to give you a
much clearer picture of how your subdirectories are arranged. To
use this, you can either have TREEFIX.BAT and TREEFIX.BAS on the
disk you want to examine and just type TREEFIX while in DOS, or
you can specify a separate drive to examine, for instance,
TREEFIX B:. (Note: TREEFIX.BAS is on the BASIC disk.
TREEFIX.BAT: ECHO OFF
ECHO Now searching directory ...
TREE %1>TREE1.LST
BASICA TREEFIX.BAS
Editor's Note: Be sure to either have TREE.COM and BASICA.COM on
whatever subdirectory the two TREEFIX files are on, or have a
PATH to TREE.COM and BASICA.COM. This technique works with up to
six levels of subdirectories; after that the display will wrap.
-----------------------------------------------------------------
FOR Play
(PC Magazine Vol 3 No 24 Dec 11, 1984 User-to-User)
FOR allows you to execute a DOS command for each of the
files in a specified set of files. It's real usefulness comes
from the fact that the set of files can be specified using
wildcard names. But FOR works only from within batch files.
To perform the same operation with a set of files with the
same extension, create a batch file called REPEAT.BAT that
contains one line:
FOR %%A IN (%2) DO %1 %%A %3
The syntax for running the batch file is:
REPEAT program filespec [/program switches]
The first command line parameter becomes the name of the
program to be run, the second parameter is the set of files to be
worked on, and the third parameter is any switches that program
may need after the program name. For example:
REPEAT EDIT *.DOC
would translate into the FOR command required to edit a set of
DOC files. REPEAT is also useful for the many public-domain
utilities that do not allow wildcard filenames.
-----------------------------------------------------------------
Nested Batch Files
(PC Magazine Vol 4 No 12 June 11, 1985 User-to-User)
You can nest batch files simply by putting COMMAND/C before
the name of the batch file to be called. When each file completes
execution, control returns to the calling batch file. This
feature is sort of documented in the DOS manual under "Invoking a
Secondary Command Processor," but the manual doesn't really tell
how to use it this way.
Tests indicate that performance doesn't degrade when in the
secondary processor. To see how this works, create the four batch
files LEVEL1.BAT, LEVEL2.BAT, LEVEL3.BAT, and LEVEL4.BAT. To run
it, type LEVEL1. Once all the batch files have finished running,
you'll see a list of echoed "Return to ..." messages onscreen
that shows how the files were nested.
In an unrelated subject, to print a list of subdirectories,
something DOS does readily, just type:
DIR|FIND"
"
Four simple files to demonstrate batch file nesting using COMMAND
/C to pass control. To use this properly, create the BEEP.BAS
program and have it and BASICA.COM on disk:
echo off
echo THIS IS LEVEL1.BAT
basica beep
command /c level2
echo Returned to LEVEL1.BAT
echo off
echo THIS IS LEVEL2.BAT
basica beep
command /c level3
echo Returned to LEVEL2.BAT
echo off
echo THIS IS LEVEL3.BAT
basica beep
command /c level4
echo Returned to LEVEL3.BAT
echo off
echo THIS IS LEVEL4.BAT
basica beep
10 BEEP
20 FOR DELAY=1 TO 100:NEXT
30 SYSTEM
--------------------
Two ways to list subdirectories. Make sure proper combinations of
TREE.COM, FIND.EXE, CHKDSK.COM, MORE.COM and SORT.EXE are on your
disk or PATHed to:
tree /f | find "Path" | more
chkdsk /v | find "Directory" | sort | more
-----------------------------------------------------------------
The Fully Powered PC
(PC World July 1985 by B. Alperson, et. al.)
The purpose of batch files is to automate commonly used
procedures. But often you may want to modify the way a procedure
works at the time you call its batch file. For this DOS provides
replaceable parameters. When you create a batch file that will
have variable information, simply use a replaceable parameter
variable at each point where such information will be needed.
Replaceable parameter variables consist of a single percent sign
and an integer (%0 through %9). When you execute the batch file,
any words you type on the command line following the batch file
name will be substituted for those variables.
DOS assigns the value of each replaceable parameter in
sequence, according to the position of the words on the command
lines. The name of the batch file, the first word on the command
line, is used as the value for parameter %0. The next word on
the command line is the value for replaceable parameter %1, etc.
Consider the word processing batch file GO.BAT (below). It
includes the replaceable parameter %1 in two lines: the line that
calls a directory and the line that calls WordStar. If you were
to invoke this file by typing GO DOCUMENT.DOC, the parameter
DOCUMENT.DOC would be substituted for each %1. Thus, the line
`DIR B:%1/W' would be interpreted by DOS as DIR B:DOCUMENT.DOC/W,
and DOS would search for the file DOCUMENT.DOC. The line `A:WS
%1' would be interpreted by DOS as A:WS DOCUMENT.DOC. By WordStar
convention, the command WS filename loads WordStar and then opens
the specified file. WordStar would then bypass its opening menu
and go immediately into document mode with the file DOCUMENT.DOC
in place for editing.
Before DOS 2.0, you were restricted to ten replaceable
parameters per batch file. With the SHIFT command DOS 2.0 removed
the ten-parameter restriction. Now the only limitation on the
number of parameters is that they all fit on a logical command
line. (A logical command line is everything you type from the DOS
prompt through the carriage return and may be up to 127 characters.)
Imagine a command line with 14 elements:
A>command w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13
You still have only ten replaceable parameter variables available,
%0 through %9. The first ten words on the command line (the
command itself and w1 through w9) are assigned to those variables.
The SHIFT command does not increase the number of variables; but
each time you use it, the variable assignments are "bumped over"
one position. With the first SHIFT command, the variables %0
through %9 are reassigned the values w1 through w10, respectively.
The value originally assigned to %0 is bumped off. Use the SHIFT
command again, and the variables %0 through %9 acquire the values
w2 through w11.
However, the true value of the SHIFT command goes beyond
getting more replaceable parameter values from the command line.
The following application shows how useful SHIFT can be.
DOS 2.0 provides a PRINT command to set up a print queue but
the command has at least two serious problems. The queue created
by PRINT is limited to 10 files, and the PRINT command does not
recognize path names. Consequently, all the files to be printed
must be in the same directory, and you have to print from that
directory. (DOS 3.0's PRINT command does not have those
limitations. The optional /Q: command enables you to specify the
number of files -- up to 32 -- that the queue will hold. The
PRINT command in DOS 3.0 also recognizes path names.)
QUE.BAT shows how the SHIFT command can set up a queue
program in DOS 2.0 (in this case called QUE.BAT) without the
limitations imposed by the PRINT command. QUE.BAT is invoked
with the following syntax:
QUE filename1, filename2, filename3 .....
This batch file allows you to queue up to 62 files, depending on
the length of the file names. The printout of each file begins on
a new page with a header consisting of the file name and a line
of hyphens.
The first two lines of QUE.BAT turn off the echo and clear
the screen. The fourth line, `A:BASICA A:FORMFEED', makes use of
a simple BASIC program called FORMFEED.BAS to start the file on a
new page. FORMFEED.BAS consists of the line:
10 LPRINT CHR$(12);:SYSTEM 'ECHO PRINTING FILE %1'
displays the name of the file currently being printed. The next
three lines send output to the printer: the first sends the
current file name; the second sends a line of hyphens, which is
part of the header; and the third TYPEs the file's contents.
All output is redirected to the printer with `>PRN'. By using
the TYPE command instead of PRINT, QUE.BAT allows you to use
path names freely in file names specified as replaceable
parameter values for QUE.BAT.
The `:PRINT' and `IF NOT ZIP==ZIP%1 GOTO PRINT' lines in
QUE.BAT are discussed below. These lines determine whether more
files must be printed. If not, the batch file terminates.
The SHIFT command makes this batch file work. The first time
through the batch file, the value %1 is filename1; all references
to %1 use that value. But before the procedure in the batch file
repeats, the SHIFT command is invoked, causing all references to
%1 to use the value filename2. The third time through the batch
file, %1 takes on the value filename3, and so on. Thus, the SHIFT
command allows the batch file to pick up each file name on the
command line with the use of a single DOS variable.
Normally the execution of a batch file flows from the first
to the last statement in the file. With branching you can
redirect the flow. Branches can be conditional or unconditional.
An unconditional branch uses the syntax GOTO label. GOTO
transfers control to the line containing the next executable
command following label. The label can be any string of up to
eight characters prefixed by a colon. The label line can include
other words; however, the label must be the first word on the line.
The conditional branch allows the batch file to choose
between actions depending on whether a certain condition is met.
The command uses the syntax:
IF [NOT] condition command
The condition parameter names any of three conditions for
testing. It can test whether or not two string values are the
same (IF [NOT] string1==string2 command). It can test for the
existence of a file (IF [NOT] EXIST filespec command). Finally,
condition can test for an exit code (IF [NOT] ERRORLEVEL number
command). When a program terminates, it can set a numerical
value, called an exit code that indicates the manner in which the
program terminated. By checking this value with ERRORLEVEL, you
can test whether the previous program terminated successfully or
with an error. This test is potentially useful, but the only
programs in DOS 2.0 that produce exit codes are BACKUP and RESTORE.
Unless your application involves these two commands or sets its own
exit codes, ERRORLEVEL is of limited value.
The EXIST filename test is crippled by the exclusion of path
names from the filename parameter. The specified file must be in
the default directory or it will not be found. This limitation
has been eliminated in DOS 3.0. However, even the weak IF
commands of DOS 2.0 add substantially to your control over batch
operations.
The QUE.BAT batch file would not work if it weren't possible
to branch within the batch file. The critical line is the
conditional branch instruction `IF NOT ZIP==ZIP%1 GOTO PRINT'.
Each time the batch file reaches this point, it tests whether the
string `ZIP' is the same as the string `ZIP%1'. If the value of
%1 is filename1, the line finds that `ZIP' does not equal
`ZIPfilename1', control is transferred to the next executable
line after the label `:PRINT', and the file is printed. The SHIFT
command bumps the assignment of %1 to the next value, filename2.
The test is then performed again, with the same outcome.
Finally, no file names remain on the command line. At this
point the test finds that `ZIP==ZIP%1', because %1 has no
assigned value. Therefore, the GOTO command is not executed, and
control passes to the next line. A final formfeed is sent to the
printer, and the batch file terminates.
`ZIP' is used as part of the string test because batch file
conditional commands cannot compare a string to a null value.
Some character(s) must be included, and the arbitrary choice ZIP
is as good as any other. Also note that the replaceable variable
is placed on the right side of the double equal signs. This
prevents the errant behavior that occurs when the right string
matches the beginning of the left string but is shorter.
DOS 2.0 also allows you to generate batch file loops. Within
certain limits, you can have the batch file recycle the same
command with different arguments. To do this, use the syntax:
FOR %%variable IN (set) DO command
The DOS manual tells you, "The %% variable is sequentially set to
each member of set, and then the command is evaluated and
executed." You may find it more helpful to think of the command
as follows: FOR each item IN (this collection of items) DO the
action specified in the command using the items appropriately.
For example, if you had to back up three files in a financial
program and you wanted to copy those files from drive A: to drive
B: with a batch file, you could use the command:
FOR %%Z IN (TRNS.DOC CHKS.DAT DEPS.LST) DO COPY A:%%Z B:
%%Z is a variable whose value is set sequentially to each name in
the collection of items. The batch file would operate once as
though instructed to COPY A:TRNS.DOC B:. It would then operate as
though instructed to COPY A:CHKS.DAT B:. Finally, it would act as
though instructed to COPY A:DEPS.LST B:. Since no items would
remain in the set at this point, the loop would terminate.
DIRALL.BAT shows how the FOR command can keep track of files
within a complex directory structure that is possible in DOS 2.0.
For example, DIRALL.BAT, with the command DIRALL *.BAT, checks
each of the 14 subdirectories listed in the FOR commands, the
root directories of drives A: and C:, and reports to the printer
the existence of each batch file. These reports are arranged
within each of the 16 subdirectories and the 2 root directories.
You would have to type 18 DIR commands, 1 for each directory, to
duplicate the behavior of the single command DIRALL.
DIRALL shows that you can intermix DOS command line
variables (replaceable parameters) and the item variable of the
FOR command in batch files. The FOR command's item variables are
identified with a double percent sign and an alphanumeric character
(%%0 through %%9 and %%A through %%Z). The FOR command can also
be used from the command line, in which case you must change the
double percent signs preceding the letter variable to a single
percent sign. For example, at the command line you would type
FOR %Z IN (A:\B:\) DO DIR %Z to display the root directories of
drives A: and B:.
One of the most powerful techniques employed in programming
is the subroutine, a program statement or set of statements that
accomplishes a specific task. Batch files have always been able
to call other batch files into execution. Normally, however, the
second batch file does not return control to the first. Although
the capability is not well documented in the DOS manual, in
versions of DOS later than 2.0, a batch file itself can be a
subroutine and can be invoked at any time by calling it with an
instruction in another batch file. Once it has accomplished its
task, the subroutine batch file automatically returns control to
the next instruction in the calling batch file.
You call for the batch file subroutine with the syntax:
COMMAND/C filespec [%# ...%#]
COMMAND/C is the subroutine call (equivalent to GOSUB). Filespec
lists the drive, the path, and the name of the batch file to use
as a subroutine; %# ...%# are the values for any replaceable
parameters in the subroutine. The only special attribute of the
subroutine batch file is that it must contain the word EXIT as
its last command. This command is the equivalent of RETURN in
many computer languages returns control to the parent batch file.
You could, for example, set up an AUTOEXEC.BAT file to
perform three tasks: setting up the clock, setting up the monitor,
and setting up the printer. If each of these tasks were a
subroutine, your AUTOEXEC.BAT file would consist of only three
major instructions. You would set up the file as follows:
ECHO OFF
CLS
COMMAND/C SETCLOCK
ECHO OFF
CLS
COMMAND/C SETMON
ECHO OFF
CLS
COMMAND/C SETPRINT
The three files serving as batch subroutines would be:
SETCLOCK.BAT: ECHO OFF
CLS
SETCLOCK
EXIT
SETMODE.BAT: ECHO OFF
CLS
MODE 40,R
EXIT
and,
SETPRINT.BAT: ECHO OFF
CLS
MODE COM1:96,N,8,1,P
MODE LPT1:=COM1
EXIT
You can "nest" batch file subroutines; that is, one
subroutine can call another, which can call another, etc. But be
careful; each level of nesting will cost you 3K of RAM. Also
remember that DOS always turns on the echo at the beginning of
any batch file. To keep the echo off, begin each batch file with
the command ECHO OFF. Unfortunately, this command, like the first
command of all batch files, is displayed. But it disappears
almost immediately if you follow it with a CLS command.
The AUTOEXEC.BAT file shown earlier is too simple to be of
much use, but it illustrates the techniques to use for more
complex subroutine operations. By using batch file subroutines
you can easily maintain and modify batch files of great complexity.
This technique also reduces debugging problems dramatically by
locating instructions in well-defined modules, and it enables you
to write the instructions for a commonly used procedure only once
and then call the routine from any batch file.
-----------------------------------------------------------------
BASIC Switches and Concurrently OPEN Files
(PC World July 1985 The Help Screen)
You can use BASIC's switches and a filename with the DOS
commands BASIC or BASICA to call a BASIC program from DOS and
still use the BASIC switches /F (to set the maximum number of
files that may be OPEN simultaneously) and /S (to set the file
buffer size to match the maximum record length the BASIC program
uses) by putting the BASIC program you're calling as the second
parameter on the DOS command lines. For example, in this excerpt:
.
SORT /+15 < A:SUBCEN.DAT > B:BAIN.DAT
BASICA BARPT
SORT /+73 < B:BAOUT.DAT > B:CASE.DAT
BASICA CASRPT /F:7/S:512
.
You can also include stdout redirection when
calling a BASIC program that switches, but the redirection
parameters in a BASIC call must precede the switch parameters.
You also need to include the line FILES=11 in your CONFIG.SYS
file. The FILES=x parameter sets the number of simultaneously
OPEN files by reserving enough RAM for x file handles. All file
accesses -- reads, writes and closes -- can then be performed by
telling DOS which file handle to use. But because DOS uses three
file handles for stdin, stdout, stderr, stdaux and stdprn, and
BASIC uses one more file handle for LOAD, SAVE, CHAIN, NAME and
MERGE commands, the FILES= parameter in the CONFIG.SYS file must
be set to exceed by four the number in BASIC's /F: switch.
-----------------------------------------------------------------
Quick Text Editor
(PC Magazine Vol 4 No 18 Sept 3, 1985 User-to-User)
BUILD.BAT lets you create text files or short programs easily.
When in DOS, enter "BUILD filename" where filename is the name of the
file you wish to create. BUILD.BAT will clear the screen, display a
ruler line and save all your input in an ASCII file with whatever
filename you assigned. When you're finished entering text, hit the
F6 key and Enter. If a file with the same name as your filename
already exists, BUILD.BAT will rename it with a .BAK extension. By
specifying PRN: as the filename, all text entered is dumped to the
current list device. This is useful for short memos or notes.
BUILD.BAT does not allow text to be edited except for the current
line. But it's useful to create small batch files or write memos or
address envelopes quickly and easily in DOS. And it's forgiving
enough not to write over an existing file.
BUILD.BAT:
ECHO OFF
IF %1==PRN: GOTO START
IF NOT EXIST %1 GOTO START
REN %1,????????.BAK
:START
CLS
ECHO 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75
ECHO ----!----!----!----!----!----!----!----!----!----!----!----!----!----!----!----
COPY CON:=%1
:END
-----------------------------------------------------------------
Quick One-Liner
(PC World September 1985 Star-Dot-Star)
CPY.BAT copies files from the default disk drive to another drive,
copying only those files that don't exist on the second drive:
for %%F in (%1) do if not exist %2%%F copy %%F %2
CPY.BAT is invoked with the command, CPY filespec d:. For example, the
command CPY *.DOC A: copies all files with the extension .DOC from the
default drive to drive A:. Path names will not work with it unless the
corresponding directories exist on both disks, and the source drive
must be the default disk drive.
-----------------------------------------------------------------
Batching Back to a Previous Directory
(PC World October 1985 The Help Screen)
Batch files are used extensively as menu selections for specific
applications. For example, if Lotus 123 is in a separate subdirectory,
a batch file can automatically switch to that subdirectory, prompt the
user to place the system disk in drive A:, and load LOTUS.COM. When
LOTUS.COM finishes, the batch file returns the user to the root
directory and displays the main menu.
Since not all users are DOS wizards, a series of help screens
for the DOS commands can be used using the HELP.BAT routines (PC World
May 1985 and PC World December 1984). However, if the help screens are
kept in their own subdirectory, a problem arises. To execute the
IF EXIST %1.HLP batch command, which tests for the existence of a
specified help file, you must be in the directory where the help
screens are located. To get HELP.BAT to work, you have to change to
the HELP subdirectory. In creating the batch file, the alternatives
are to leave users in the HELP subdirectory or return them to the root
and the main menu.
Editor's Note: DOS 3.0 and later versions accept paths in the
IF EXIST command, so you don't have to leave the current directory to
test whether a file exists in another directory. For DOS 2.x, output
redirection and BASIC can get the user back to the directory from which
HELP.BAT was called. Modify HELP.BAT as follows:
echo off
cls
cd >c:\help\original.dir
cd c:\help
if exist c:%1.help goto does
if x==%1x goto help
echo Sorry. Help unavailable for %1
goto end
:does
type c:%1.hlp
goto end
:help
type c:help.hlp
:end
pause
basica c:reset_cd
There are three basic differences between this HELP.BAT and the
one used. The line "cd>c:\help\original.dir" redirects the output of
this CD command (display current directory) into a file named
ORIGINAL.DIR. The drive designator C: has been prefixed to the file
names in HELP.BAT so that those files are found even when C: is not the
default drive. And the new batch file ending, "basica c:reset_cd"
returns the user to the directory that was current when HELP.BAT was
called.
Load BASIC(A) and create RESET_CD.BAS:
10 OPEN "C:ORIGINAL.DIR" FOR INPUT AS #1
20 INPUT #1,A$
30 CHDIR A$
40 SYSTEM
Use the command SAVE "C:\HELP\RESET_CD" to save this program in
the HELP subdirectory on drive C:. This program reads the name of the
user's original subdirectory from the file ORIGINAL.DIR, changes to
that directory and exits to DOS.
This routine assumes that BASIC(A) and HELP.BAT are available via
the extended directory search path defined by the latest PATH command.
For example, with HELP.BAT in a directory called BATCH and BASIC(A) in
a directory called DOS, your hard disk's AUTOEXEC.BAT file might
contain the command "PATH=C:\BATCH;C:\DOS;" so that the commands in
those directories are available from any directory.
-----------------------------------------------------------------
Creating Batch Files With Echo
(PC World November 1985 Star-Dot-Star)
You can reduce the space that batch files use by having the ECHO
command create them on a RAM disk. Since a single batch file can
contain any number of ECHO commands, a couple of large batch files
filled with ECHO commands can replace dozens of the space-wasting kind.
An as example, you can include the line: echo basica menu.bas/
f:6 > d:menu.bat among others in an AUTOEXEC.BAT file. (You can
place it in any batch file, as long as it executes before you need the
file it creates.) The greater-than symbol sends the output of the ECHO
command to a file instead of to the screen. When the AUTOEXEC.BAT file
executes, it creates the batch file MENU.BAT on drive D:. The RAM disk
runs the batch file more quickly than a floppy.
This technique can be enhanced by using the FOR subcommand. For
example, the command: echo for %%%%f in (cls dbase pause d:menu) do
%%%%f > d:db.bat creates a batch file that clears the screen, runs
dBASE, waits for you to press a key, and then runs a menu program on
drive D:. Note that the lines use quadruple percent signs; they are
necessary because DOS strips some of them as the command executes.
Editor's Note: You can create multiline batch files by sending
several ECHO statements in a row to the same file, using double
greater-than signs to append the new lines to those already sent.
For example, if you place the lines shown in BUILDBAT.BAT below in an
AUTOEXEC.BAT or other batch file, they create a five-line batch file
called D.BAT, which turns echo off, clears the screen, changes the
DOS prompt, waits for the user to press a key, and then lists the
directory of the current disk. Also, with the aid of the IF subcommand
it's easy to create a complex menu system that uses just two batch
files.
- - - - -
BUILDBAT.BAT:
echo echo off > d.bat
echo cls >> d.bat
echo prompt $p$g >> d.bat
echo pause >> d.bat
echo dir >> d.bat
-----------------------------------------------------------------
Batch Tricks
(PC Magazine Vol 4 No 26 Dec 24, 1985 User-to-User)
With DOS 2.1, it's simple to create blank lines in batch files by
typing ECHO following it with two spaces. However, in DOS 3.1, this
trick won't work. DOS will interpret an ECHO followed by blanks as a
request for the current ECHO status, and since most users turn ECHO OFF
in the first line of a batch file, all you'll get is an "ECHO is off"
message.
If you create your batch files using the DOS COPY CON: command,
the way to get around this and end up with a blank line in DOS 3.1 is
to type in the word ECHO and then hold down the space bar until the
cursor wraps to the next line. When the cursor moves down to the next
line, type your message.
Another batch file problem is that it's handy when writing
instructions for novices to refer to the Enter key by actually drawing
on-screen the crooked arrow that IBM put on the Enter key. You can
assemble a representation of this crooked arrow by printing characters
17, 196, 196, and 217. To see this, run this BASIC program:
10 PRINT CHR$(17);
20 PRINT STRING$(2,196);
30 PRINT CHR$(217)
However, while DOS allows you to print virtually any of the 256
possible characters on the screen by holding down the Alt key, typing
in the ASCII number of the character on the number pad, and then
releasing the arrow key, it can't handle characters with ASCII values
lower than 32.
One way to create an arrow is to first load BASICA, type in a
line number, a space, the "remakr" statement REM, and a space. Then
use the Alt plus number pad trick with 17, 196, 196, and 217. Save the
file as ARROW.BAS. Then load your word processor and delete the line
number and the REM statement, leaving just the arrow itself. If you
use WordStar, the arrow will appear as ^QDDY, but it will resemble an
arrow once you're back in DOS. They you can insert this pictorial
arrow into any batch file instead of having to say "Hit the
key."
Editor's Note: While the first technique does work, you have to
add several extra spaces at the beginning of your message on the second
line to compensate for the space taken up by the word "ECHO," or else
this message will start as the end of the first line. Also, the DOS
COPY CON: trick can handle only 127 characters, which limits the kinds
of messages you can write. A better way to end up with a blank line
in DOS 3.1 is to type ECHO, follow it with one or two spaces, and then
follow the spaces immediately with a CHR$(255), which you can produce
by holding down the Alt key, typing 255 on the number pad, and then
releasing the Alt key. The ECHO+space+space+CHR$(255) blank line trick
works in DOS 3.1. Who knows what Microsoft and IBM will do with future
versions?
There are two easier ways to display the "arrow" (Enter) key. One
is to write a small BASIC file:
10 OPEN "arrow." FOR OUTPUT AS #1
20 PRINT #1,CHR$(17);
30 PRINT #1,STRING$(2,196);
40 PRINT #1,CHR$(217)
50 CLOSE
Another even simpler way is to use DEBUG:
A>debug
-n arrow
-e 100 11 c4 c4 d9
-r cx
-4
-w
-q
-----------------------------------------------------------------
Disk Memo Pad
(PC Magazine Vol 4 No 26 Dec 24, 1985 User-to-User)
The DD.BAT file creates a small memo or diskette description file
and lets you update it automatically without having to use a word
processor. You can copy the small DD.BAT file to all your disks and
use it to remind yourself what's on the disk -- and update the reminder
automatically. After you've entered any information, typing DD will
display it. To update the information, just type DD followed by up to
nine words of text. The next time you type DD the new message will
appear, appended to the old.
Editor's Note: The nice thing about this is that you can leave
memos to yourself up to 23 lines long and update the memos without
having to load a word processor. The ^G in the 7th line from the
bottom is a beep. You can enter this in WordStar by typing Ctrl-P
Ctrl-G.
DD.BAT:
echo off
if z==z%1 goto display
echo %1 %2 %3 %4 %5 %6 %7 %8 %9 >> %0.doc
:display
cls
if not exist dd.doc goto :oops
type %0.doc
goto end
:oops
echo ^GYou haven't entered anything yet .....
echo To enter date, type DD and then type up
echo to 9 words on each line.
echo You can enter up to 23 lines.
echo ----
echo To see what you've typed, just type DD
:end
-----------------------------------------------------------------
...To the Rescue
(PC Magazine Vol 3 No 14 July 24, 1984 User-to-User)
Most computers can provide a help facility. By typing the word
HELP, optionally followed by a program name, the user gets a quick
how-to on the requested program.
Create the batch file HELP.BAT (below). Then, using your word
processor (of simply by typing COPY CON::HLP, create files
with the .HLP extension that explain each of the programs. With this
batch file and your .HLP files, you can keep lots of information at
your fingertips. To hold the files in a subdirectory called HLPFILES,
use CD\HLPFILES at the DOS prompt.
HELP.BAT:
echo off
cls
if %1==SUBJECTS goto subjects
if %1==subjects goto subjects
if not exist \hlpfiles\%1.hlp goto nofile
copy \hlpfiles\%1.hlp con
goto endbatch
:subjects
dir \hlpfiles\*.hlp/w
goto endbatch
:nofile
echo Type HELP followed by the file name (or HELP * for all)
echo Type HELP subjects for a list of available topics
:endbatch
-----------------------------------------------------------------
Magic Batch Fingers
(PC Magazine Vol 4 No 2 Jan 22, 1985 User-to-User)
Some DOS commands, such as FORMAT and ERASE*.*, require keyboard
input and thus cannot be used in an unattended batch file. For
example, if you enter FORMAT A:/V, you will be instructed to place the
disk in drive A: and to press any key to continue. You will then be
asked to enter a VOLUME ID for the disk, and then whether you want to
format another. If this FORMAT command were command executed from a
batch file, the batch processing would stop and wait for your keyboard
responses to these prompts. Here's a method to eliminate the keyboard
input.
First, either with a word processor or using the DOS COPY CON:
command, construct a file called RESPONSE that contains the responses:
A>COPY CON:RESPONSE
NEWDISK
N
^Z
The first line copied to the file is a blank line produced by just
pressing Return. This is important since it contains the Return key
press needed in response to "Press any key to continue." NEWDISK will
be the VOLUME ID. N is the response to the prompt, "Format another
(Y/N)?". ^Z is the EOF marker.
Next, place the following line in the batch file where you would
normally put the FORMAT command:
TYPE RESPONSE|FORMAT A:/V
The TYPE command would normally display the contents of RESPONSE on the
screen, but the | symbol instead pipes the contents of RESPONSE to the
inputs in the FORMAT command, so they answer the prompts that would
normally be answered from the keyboard.
This same method can be used to answer the "Are you sure?" prompt,
which comes up if you enter ERASE*.*. The keyboard inputs in these DOS
commands are safety features that help prevent accidental erasures by
letting the operator verify the command entry before it executes, so be
sure to use them with great care.
Editor's Note: This trick works wonders automating batch files
and speeding up things in general. For instance, if you're performing
lots of DISKCOPYs, you can load the disk to be copied onto a RAMdisk
and then write a batch file to DISKCOPY to A: and then B: and then go
back to the beginning and copy A: again - all without having to enter
lots of Y's to continue. This lets you replace copied disk with raw
ones in rapid succession. This also lets you do such nasty things as
putting DEL*.* commands in places that don't need confirmations. If
you're putting together a big batch file with lots of commands that
would ordinarily need responses, be sure the responses are synchronized
to the questions. If a complex batch file encounters an error, you
could end up confirming some very destructive commands. You can do
serious damage, even with simple files. For example, if you create a
file called TROUBLE with just a Y and carriage return in it, then type:
TYPE TROUBLE|DEL*.*
your disk suddenly turns blank. If you do try this, you can replace
all the files with DEBUG by using the L command to load in the
directory and then change all the hex E5's back to their original
characters.