home *** CD-ROM | disk | FTP | other *** search
/ Collection of Education / collectionofeducationcarat1997.iso / COMPUSCI / DOSIMP12.ZIP / SIMPLY2.HYP < prev    next >
Text File  |  1992-01-16  |  106KB  |  1,902 lines

  1.                           What Is a |tBatch|t File?
  2.  
  3. Oh, my, this is fun.  |nBatch|n files are what got me so interested in learn-
  4. ing how to use DOS.  They're absolutely fascinating!  It is a very simple
  5. sort of Programming, in a way.  But so simple that anyone can do it!
  6.  
  7. Well, a |nbatch|n file is just a plain ASCII text file, that contains nothing
  8. except a |nbatch|n of DOS commands, each command on a separate line, and each
  9. line ending with a carriage return (the <Enter> key).  The |nbatch|n file can
  10. have any name you want to give it,  but it must have the extension  .BAT,
  11. and it's a very good idea  to not ever give a |nbatch|n file the same name as
  12. any other command on your system.
  13.  
  14. A |nbatch|n file is an executable file, so when you just type its name at the
  15. DOS prompt, and hit <Enter>, the |nbatch|n file will run, just like any other
  16. command.  DOS will read the first line of the |nbatch|n file, and execute the
  17. command, read the next line and execute it, etc., until DOS finds that no
  18. more lines are left to be executed.  That's it!
  19.  
  20.                         <page down> for more Batch
  21. |nBatch|n files can contain any commands at all, which includes internal com-
  22. mands that reside inside the COMMAND.COM file, .COM files, .EXE files, or
  23. even other .BAT files (but not CONFIG.SYS commands).   Some internal com-
  24. mands are almost never used for anything else besides |nbatch|n files.  Those
  25. are CALL, ECHO, FOR, GOTO, IF, PAUSE, REM, and SHIFT.   Replaceable para-
  26. meters are another thing that is only used in |nbatch|n files.  Each of those
  27. items has its own chapter here, so check them out for more information.
  28.  
  29. Environment variables  can be used from within a |nbatch|n file,  in a manner
  30. similar to the use of replaceable parameters.  If you have an environment
  31. variable named ONE which was set equal to YES via the command SET ONE=YES
  32. then you could  reference that variable  from inside a |nbatch|n file by sur-
  33. rounding its name with percent signs, as in %ONE%.  Here's an example:
  34.           IF %ONE%!==YES! GOTO OK
  35. Now when DOS is executing the |nbatch|n file that contains that line, it will
  36. see the %ONE%  and go look in the environment  to find the variable named
  37. ONE,  look at what ONE is set equal to, and replace ONE with that string.
  38. So when DOS gets done with that, the above line will look like:
  39.           IF YES!==YES! GOTO OK
  40.                         <page down> for more Batch
  41. and so the IF test  will come out positive,  and the GOTO command will be
  42. executed.   Now this doesn't actually change the |nbatch|n file at all,  just
  43. the way DOS  interprets the line.   The next time DOS  executes the |nbatch|n
  44. file, it still says IF %ONE%!==YES! GOTO OK,  but if the environment var-
  45. iable ONE is set equal to NO this time,  then when DOS expands that line,
  46. it will say IF NO!==YES! GOTO OK this time, so that the GOTO command will
  47. get ignored because the IF test fails.
  48.  
  49. The reason for the exclamation points in my examples,  is in case you had
  50. forgotten to set  the environment variable.   If the ONE variable  didn't
  51. exist,  then when DOS expands the %ONE% variable, it will find nothing at
  52. all,  so the command will be like IF !==YES! GOTO OK.   That IF test will
  53. fail, but at least it won't cause DOS to freak out.  If we left out the !
  54. symbols,  and the line said IF %ONE%==YES GOTO OK, then when DOS expanded
  55. that,  it would say  IF ==YES GOTO OK,  if the ONE variable didn't exist,
  56. and since one side of the == signs is empty,  DOS won't like that at all,
  57. and you'll get a "Syntax error" message, and the |nbatch|n file will continue
  58. with the next command which might not be what you intended!   So you want
  59. to put some symbol  on each side of the == signs to protect from that oc-
  60.                         <page down> for more Batch
  61. currence.  You can use the exclamation point like I did or just about any
  62. symbol you want,  as long as it's the same on both sides of the == signs.
  63.  
  64. Here's an example  of a way  that you can  take advantage  of environment
  65. variables  in a |nbatch|n file.   Suppose there's  a certain set  of commands
  66. that you would like to execute twice in a row,  but not more.   You could
  67. do this:
  68.           SET AGAIN=
  69.           :START
  70.           (commands you want repeated go here)
  71.           IF !%AGAIN%==!NO GOTO END
  72.           SET AGAIN=NO
  73.           GOTO START
  74.           :END
  75.           SET AGAIN=
  76. Now,  when you execute that |nbatch|n file,  the first line sets the environ-
  77. ment variable AGAIN  equal to nothing,  to make sure the variable doesn't
  78. already exist.  The :START line is just a label for the GOTO command that
  79. comes later,  so it has no effect the first time through.   Then the main
  80.                         <page down> for more Batch
  81. |nbatch|n file commands are executed, and then comes the IF statement.  Well,
  82. since at this point,  AGAIN is not set  equal to  anything,  the GOTO END
  83. command will be ignored,  and the next line,  SET AGAIN=NO will be execu-
  84. ted.   Then the command GOTO START  tells DOS to start over again  at the
  85. label that says :START.   So those main commands get executed again,  and
  86. then the IF test is positive this time,  because you already executed the
  87. SET AGAIN=NO line,  so this time the GOTO END  command does get executed,
  88. which sends DOS  to the line that says :END,  and then the AGAIN variable
  89. is once again removed from the environment, and the |nbatch|n file is done.
  90.  
  91. Another way  that the use of  environment variables  from within  a |nbatch|n
  92. file comes in handy, is with the PATH variable.   Suppose that you have a
  93. program that you want to run,  for which you need to have  that program's
  94. directory on the PATH,  but you don't want to leave that directory on the
  95. PATH all the time.  Well check out this |nbatch|n file:
  96.           SET OLD=%PATH%
  97.           SET |sPATH|s=C:\WORD;%OLD%
  98.           WORDPROC
  99.           SET |sPATH|s=%OLD%
  100.                         <page down> for more Batch
  101.           SET OLD=
  102. Now supposing  that your  PATH variable  started out like  C:\DOS;C:\UTIL
  103. then while  that |nbatch|n file is  being executed,  each time  you reference
  104. the PATH  or OLD variables,  they will be expanded to say  C:\DOS;C:\UTIL
  105. and here's what the |nbatch|n file will look like to DOS:
  106.           SET OLD=C:\DOS;C:\UTIL
  107.           SET |sPATH|s=C:\WORD;C:\DOS;C:\UTIL
  108.           WORDPROC
  109.           SET |sPATH|s=C:\DOS;C:\UTIL
  110.           SET OLD=
  111. So,  the first line makes a variable called OLD which is just a duplicate
  112. of what your  PATH variable says at the moment.   The second command sets
  113. a new PATH variable, which is C:\WORD; followed by what used to be in the
  114. PATH variable a minute ago.  Then the WORDPROC program gets run, and then
  115. the next line puts  the PATH variable back  to the way it used to be,  by
  116. setting it equal to the  OLD variable which you created  at the beginning
  117. of the |nbatch|n file.   And the last line  removes the OLD variable from the
  118. environment  since it's not needed any more,  and we don't want  to waste
  119. environment space by just leaving it there for no reason.
  120.                         <page down> for more Batch
  121. Well speaking of PATH variables, |nbatch|n files are an excellent way to keep
  122. your PATH short.   The only directories that should go on your PATH,  are
  123. those which contain commands that you need to run  with some other direc-
  124. tory as the current one.  For commands that you can run from within their
  125. own directory,  those commands should not go on the PATH.   Instead,  you
  126. should use a |nbatch|n file  (or DOSKEY macro)  to make that command's  drive
  127. and directory current, run the program,  and change back to the root dir-
  128. ectory.  Like this:
  129.           C|1:
  130.           CD C:\WORD
  131.           WORDPROC
  132.           CD \
  133. Now you name that |nbatch|n file  WP.BAT,  and put it into  a directory which
  134. contains nothing but |nbatch|n files (name it BELFRY, perhaps, or CAVE, since
  135. that's where  .BATs go),  and put that |nbatch|n file directory  on the PATH,
  136. then you can access your WORDPROC program from any directory on your sys-
  137. tem, just by typing WP <Enter>, even if C:\WORD is not on your PATH.  So,
  138. after you create  such a |nbatch|n file  for each of your  main applications,
  139. now the only directories you need to keep on your PATH  are the one where
  140.                         <page down> for more Batch
  141. you keep your |nbatch|n files,  the one where you keep your DOS external com-
  142. mands,  and the one where you keep other third-party utilities  that only
  143. have one or two files per program, such that you wouldn't want a separate
  144. directory for each of them.   That last directory  you might want to name
  145. UTIL, short for utilities.  So, with only three directories on your PATH,
  146. your whole system will be a lot more efficient.
  147.  
  148. The problem with |nbatch|n files  is that each one takes up an entire cluster
  149. of disk space, just like any other file, even though |nbatch|n files are gen-
  150. erally very small.   A 28-byte |nbatch|n file takes up 2048 bytes of space on
  151. a hard disk.   What a waste!   Well you can use replaceable parameters to
  152. combine all of your little |nbatch|n files  into one great big |nbatch|n file in-
  153. stead.   See the section about the GOTO command to find out how.   Now if
  154. you do that,  you don't need to keep  an entire directory  for your |nbatch|n
  155. files,  since you only have  one |nbatch|n file.   So just put your big |nbatch|n
  156. file into  the UTIL directory  and remove  the |nbatch|n file directory  from
  157. your disk and from your PATH.
  158.  
  159. If you have DOS version 5.0,  you can do just about everything you can do
  160.                         <page down> for more Batch
  161. with |nbatch|n files, with DOSKEY macros instead, except for accessing envir-
  162. onment variables, or using the GOTO or SHIFT commands.  DOSKEY macros can
  163. not do those things.   And DOSSHELL menu items  can do everything  except
  164. GOTO and SHIFT.   So if you upgrade  to DOS version 5  you should convert
  165. all your |nbatch|n files that don't do those things, to one of those options.
  166. You still need to learn  about |nbatch|n files anyway though,  because DOSKEY
  167. macros and DOSSHELL menu items  are put together  by the same rules  that
  168. |nbatch|n files follow.
  169.  
  170. And you have to know about |nbatch|n files  in order to keep a nice efficient
  171. AUTOEXEC.BAT file.   That's a very special  |nbatch|n file  that DOS executes
  172. every time  you reboot your computer.   It's the only |nbatch|n file that has
  173. to have a specific name, and that has to be located in the root directory
  174. of the disk you boot from,  and that in most cases, you never want to ex-
  175. ecute.  Just let DOS execute it all by itself.   If you want the AUTOEXEC
  176. .BAT to be executed,  |sreboot|sing is the best way to get that accomplished.
  177. See the AUTOEXEC.BAT chapter for the reasons.
  178.  
  179. You might want to have your AUTOEXEC.BAT contain just one command:
  180.                         <page down> for more Batch
  181.           @C:\DOS\STARTUP
  182. and then you  would have  a |nbatch|n file  named STARTUP.BAT  in your C:\DOS
  183. directory,  which the AUTOEXEC.BAT would run every time you reboot.   The
  184. reasoning behind this is that a lot of software programs that you install
  185. are going to  add commands  to your AUTOEXEC.BAT file.   Well if you have
  186. that really simple  one-line  AUTOEXEC.BAT file,  then it will be  really
  187. easy  for you to figure  out what changes an installation program made to
  188. that file so you can decide which of those changes you want to keep.  Put
  189. those changes into your STARTUP.BAT file,  and remove them from your one-
  190. line AUTOEXEC.BAT file.   This lets you control your own system,  instead
  191. of letting some software programmer control your system for you.
  192.  
  193. Since percent signs are used in |nbatch|n files  to refer to environment var-
  194. iables and  replaceable parameters,  you have to do  something special to
  195. make a |nbatch|n file understand a percent sign  in any other context.   Like
  196. if you have a file named  HELLO%.TXT,  if you mention  that filename in a
  197. |nbatch|n file,  DOS will flip out over trying to figure out what replaceable
  198. parameter  or environment variable  you're trying to reference.   Because
  199. that's what percent signs are supposed to mean in a |nbatch|n file.  Well all
  200.                         <page down> for more Batch
  201. you need to do,  is write that filename  with two percent signs  whenever
  202. you  mention it in a |nbatch|n file.   Just refer to the file as  HELLO%%.TXT
  203. whenever you're mentioning it  in a |nbatch|n file,  and DOS will  understand
  204. then,  that it's supposed to  ignore that particular  percent sign as far
  205. as special |nbatch|n file processing is concerned.
  206.  
  207. DOS version 3.3 introduced  a special new use for the @ symbol,  which is
  208. good for |nbatch|n files.  If you put @ as the first character of any command
  209. line in a |nbatch|n file,  then that particular line  will not show up on the
  210. screen while the |nbatch|n file is executing.   For example, you know how the
  211. ECHO OFF command tells DOS not to show the commands on the screen as they
  212. get executed.   But when the  ECHO OFF command gets executed,  it has not
  213. been executed yet so the ECHO OFF command itself does show on the screen.
  214. Well if you have DOS version 3.3 or later,  you can say @|sECHO|s OFF instead
  215. of just ECHO OFF, and then you'll never again see the ECHO OFF command on
  216. your screen.  Isn't that nice?
  217.  
  218. One thing that a lot of people try to accomplish  with |nbatch|n files,  that
  219. just won't work,  is to feed  commands or keystrokes  to another program.
  220.                         <page down> for more Batch
  221. Suppose you have a game which, as soon as it's loaded, it asks you wheth-
  222. er you have a color monitor, and you have to tell it Y,  and then it asks
  223. you  whether you want to use  the mouse or the keyboard,  and you have to
  224. tell it K, and you're tired of typing those silly keystrokes every single
  225. time you run that game.   Well you might be tempted to write a |nbatch|n file
  226. like this:
  227.           GAME
  228.           Y
  229.           K
  230. Well guess what's going to happen when you run that |nbatch|n file?  The game
  231. will run,  and it will wait for your answers to those questions just like
  232. always,  and then when you're finished playing the game,  and you exit to
  233. DOS,  you'll see the "|sBad command or filename|s" error message twice.   Why
  234. did that happen?   Well it's because  the Y and K lines of the |nbatch|n file
  235. don't get executed until after the GAME command finishes  and passes con-
  236. trol back to DOS,  so that DOS can read  the next command  from the |nbatch|n
  237. file.   And since there are no such commands in DOS, as Y and K, then you
  238. get that error message.
  239.  
  240.                         <page down> for more Batch
  241. One line of a |nbatch|n file does not get executed, in fact does not even get
  242. read by DOS, until the line before it is completely finished.  There's no
  243. way around that, at all.
  244.  
  245. But there are two ways to feed information to a program.   If the program
  246. will accept STanDard INput,  you can use  the piping form of redirection.
  247. But if  the program  reads its input  straight from the keyboard,  rather
  248. than using DOS's normal STanDard INput, then you will need a little util-
  249. ity called  a Keyboard Stuffer instead.   There are quite a few shareware
  250. and public domain keyboard stuffers,  such as PC Magazine's KEY-FAKE.COM.
  251. These little utilities  will feed just about any keystrokes to just about
  252. any program,  and they are available for downloading  from just about any
  253. BBS in the country.
  254.  
  255. You can use  the COPY CON command,  or the EDLIN  line editor,  or if you
  256. have DOS  version 5.0,  you have the EDIT command.   You can even use the
  257. ECHO command  with output redirection.   All of these things  will create
  258. |nbatch|n files, or any other files you might want to create.  EDLIN and EDIT
  259. can also change |nbatch|n files that already exist.  Any text editor, and any
  260.                         <page down> for more Batch
  261. word processor that can save files in plain  ASCII format can also do it.
  262.  
  263. There are even cases  in which you can use certain DOS commands to create
  264. |nbatch|n files, from within other |nbatch|n files, to perform certain functions.
  265. For example,  if you execute the PATH command with no parameters, it will
  266. tell you what your PATH environment variable  currently says,  like this:
  267.           |sPATH|s=C:\DOS;C:\UTIL
  268. Well, that's the exact same format that you use to enter a new PATH vari-
  269. able!   So if you were to type  PATH > OLDPATH.BAT that'd use redirection
  270. to create a new |nbatch|n file  named OLDPATH  and you could change your PATH
  271. to whatever  you wanted,  and then if  you were to later  execute OLDPATH
  272. <Enter>, then that |sPATH|s=C:\DOS;C:\UTIL command would be executed,  to put
  273. your PATH  back to the way it had been before you started!   This sort of
  274. thing can be extremely useful.  See the end of the DATE chapter for more.
  275.  
  276.  
  277.  
  278.  
  279.  
  280.                      <page down> for The |nCALL|n Command
  281.                              The |TCALL|T Command
  282.  
  283. This is a batch file command,  which has almost no use at the DOS prompt.
  284. It only exists in DOS versions 3.3 and later.  Before that, it was neces-
  285. sary to use the COMMAN|1D /C command to accomplish the same thing.  What it
  286. does is to run another batch file from within a batch file, and still re-
  287. turn to the calling batch file  after the called batch file is completed.
  288.  
  289. Usually if you run one batch file from within another one,  when the sec-
  290. ond one finishes it just  gives you back  a DOS prompt,  without ever re-
  291. turning to finish the rest of the batch file from which it was run.   The
  292. |nCALL|n command takes care of that problem.
  293.  
  294. Another thing about the |nCALL|n command is that if ECHO was off in the call-
  295. ing batch file,  then ECHO will remain off in the called batch file.   So
  296. the second one doesn't have to have  ECHO OFF as its first line.   But if
  297. you want ECHO to be on in the called batch file,  then its first line has
  298. to be ECHO ON,  even though that's the default for any batch file  and it
  299. doesn't normally have to be specified.  But ECHO will still be off in the
  300.                         <page down> for more CALL
  301. calling batch file, when you get back to it.
  302.  
  303. You can use replaceable parameters in a called batch file also.  Just en-
  304. ter the parameters on the |nCALL|n command line, like this:
  305.           |nCALL|n BATCH2 ONE TWO THREE
  306. This command would run  the BATCH2.BAT file,  with ONE as %1,  TWO as %2,
  307. and THREE as %3.
  308.  
  309. You can also call a batch file  that is not in the current directory,  or
  310. on the PATH, by specifying its full |spath|sname like this:
  311.           |nCALL|n C:\BELFRY\BATCH2
  312.  
  313. If you use |nCALL|n (or COMMAN|1D /C)  to run a second batch file from within a
  314. first one, then as soon as the second batch file is done, the first batch
  315. file will continue  right where it left off,  at the line right after the
  316. |nCALL|n (or COMMAN|1D /C) command.
  317.  
  318. Of course you can still use the COMMAN|1D /C technique even if you have DOS
  319. version 3.3 or later, but it's almost always more efficient to use |nCALL|n.
  320.                         <page down> for more CALL
  321. There is one situation where the |nCALL|n command is useful at the DOS prompt
  322. rather than in a batch file,  and that has to do with the FOR command.
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.                      <page down> for The |nECHO|n Command
  341.                              The |TECHO|T Command
  342.  
  343. This is a batch file command,  but it does have  some uses on the command
  344. line.   Its main use is to display text on the screen, or to tell DOS not
  345. to display text on the screen.
  346.  
  347. Whenever DOS loads a copy of the COMMAND.COM file into memory, whether it
  348. be the first copy or another copy, the state of echo is on.  Whenever DOS
  349. finishes executing a batch file, and returns to the prompt, it turns echo
  350. on.  What echo on means is that whatever commands are executed from with-
  351. in a batch file,  will show on the screen as they are read from the batch
  352. file.   If you don't want the commands to show  on the screen as they are
  353. executed,  then you want to turn echo off.   Then later in the same batch
  354. file  if you want the commands  to display again,  you turn echo back on.
  355. You can also use the |nECHO|n command to display your own text on the screen.
  356. And the |nECHO|n command all by itself with no parameters, will make DOS tell
  357. you whether the |ncurrent|n state of echo is off or on.
  358.  
  359. Suppose you have a batch file  named TEST.BAT which contains these lines:
  360.                         <page down> for more ECHO
  361.           DATE
  362.           TIME
  363.           VER
  364.           DIR
  365. Now, you execute that batch file by typing TEST <Enter>.   Here's what'll
  366. happen to your screen (minus the blank lines):
  367.           C:\>TEST
  368.           C:\>|sDATE|s
  369.           |nCurrent|n date is Mon 06-24-1991
  370.           Enter new date (mm-dd-yy): _
  371.           C:\>|sTIME|s
  372.           |nCurrent|n time is 05:30:53.72p
  373.           Enter new time: _
  374.           C:\>|sVER|s
  375.           MS-DOS Version 5.00
  376.           C:\>|sDIR|s
  377.            Volume in drive C is drive C
  378.            Volume Serial Number is 16CB-74E4
  379.            Directory of C:\
  380.                         <page down> for more ECHO
  381.           COMMAND  COM     47855 05-09-91   5:00a
  382.           AUTOEXEC BAT       861 06-18-91   4:58p
  383.           CONFIG   SYS       287 06-17-91   6:58p
  384.                   3 file(s)      49003 bytes
  385.                               69025792 bytes free
  386.           C:\>
  387.           C:\>
  388. Now if you were to add |nECHO|n OFF as the first line of that batch file, and
  389. leave the rest the same, here's what your screen would do instead:
  390.           C:\>TEST
  391.           C:\>ECHO OFF
  392.           |nCurrent|n date is Mon 06-24-1991
  393.           Enter new date (mm-dd-yy): _
  394.           |nCurrent|n time is 05:30:53.72p
  395.           Enter new time: _
  396.           MS-DOS Version 5.00
  397.            Volume in drive C is drive C
  398.            Volume Serial Number is 16CB-74E4
  399.            Directory of C:\
  400.                         <page down> for more ECHO
  401.           COMMAND  COM     47855 05-09-91   5:00a
  402.           AUTOEXEC BAT       861 06-18-91   4:58p
  403.           CONFIG   SYS       287 06-17-91   6:58p
  404.                   3 file(s)      49003 bytes
  405.                               69025792 bytes free
  406.           C:\>
  407. A lot less clutter on the screen this time, huh?  First of all, until af-
  408. ter the first command has executed, echo is still on, so you see the |nECHO|n
  409. OFF command.   (In DOS version 3.3 or later,  you can use the @ symbol to
  410. supress the display of any command even when echo is on so if you changed
  411. that line to @ECHO OFF, then it wouldn't show on the screen either.)  But
  412. after that,  no more |sprompt|ss get sent to the screen,  and only the output
  413. of each command shows, not the commands that cause the output.
  414.  
  415. Then at the end,  notice that  there is only one prompt  this time.   You
  416. see,  when echo is on,  DOS is displaying the prompt for each line,  then
  417. looking to see if there is another command  in the batch file to be exec-
  418. uted or not.  Well after the DIR command, DOS finds that there aren't any
  419. commands left,  so it closes up the batch file interpreter and turns echo
  420.                         <page down> for more ECHO
  421. on  (which doesn't matter this time  because echo was on  the whole time)
  422. and displays another prompt.  But when echo is off, DOS is not displaying
  423. a prompt in between  each command of the batch file,  so that last prompt
  424. that would be showing  while DOS looks to see  if there are  any commands
  425. left in the batch file,  doesn't show on the screen.   No |sprompt|ss show on
  426. the screen  until the batch interpreter is closed down and echo is turned
  427. back on.
  428.  
  429. How about an example  of using the |nECHO|n command to display text onscreen?
  430.           |nECHO|n HELLO.
  431.           |nECHO|n HOW ARE YOU?
  432. Now if that batch file were executed, the screen would be like this:
  433.           C:\>ECHO HELLO.
  434.           HELLO.
  435.           C:\>ECHO HOW ARE YOU?
  436.           HOW ARE YOU?
  437.           C:\>
  438.           C:\>
  439. Not exactly what you  had intended, right?   Well make the  first line of
  440.                         <page down> for more ECHO
  441. that batch file @ECHO OFF, leave the rest the same, and execute it:
  442.           HELLO.
  443.           HOW ARE YOU?
  444.           C:\>
  445.  
  446. Well you can also use  the |nECHO|n command at the DOS prompt instead of in a
  447. batch file,  but that's only  appropriate if you're  using redirection to
  448. send the output  of the |nECHO|n command  to some other device  instead of to
  449. the screen.   For example,  |nECHO|n HELLO > PRN would make your printer type
  450. the word HELLO.
  451.  
  452. Another sort of a device that you can redirect output to,  is a filename.
  453. You could actually write  a batch file to disk  by using the |nECHO|n command
  454. with redirection.  Note that the > symbol creates a brand new file by the
  455. name you specify,  and if that file already existed at the time,  it gets
  456. erased.   A double >> sign  means for DOS to add the text  to the already
  457. existing file,  without deleting the file first.   So to create the above
  458. TEST.BAT file, you could use these commands from the DOS prompt:
  459.           |nECHO|n DATE > TEST.BAT
  460.                         <page down> for more ECHO
  461.           |nECHO|n TIME >> TEST.BAT
  462.           |nECHO|n VER >> TEST.BAT
  463.           |nECHO|n DIR >> TEST.BAT
  464.  
  465. The |nECHO|n command  always sends along a carriage return  (the <Enter> key)
  466. at the end of each thing that it sends,  so that batch file you just cre-
  467. ated does not say DATE TIME VER DIR.  It's got each command on a separate
  468. line just like it's supposed to.
  469.  
  470. If you try  to display  instructions  containing one  of the  redirection
  471. characters using  the |nECHO|n command,  redirection will take place  and the
  472. results will not be what you expected.  For example, a command like:
  473.           |nECHO|n Type TYPE FILENAME.EXT > PRN
  474.           |nECHO|n to print out this file.
  475. will send the words  "Type TYPE FILENAME.EXT"  to the printer.   In later
  476. versions of DOS, though, you can get the results you wanted by using
  477.           |nECHO|n Type "|sTYPE|s FILENAME.EXT > |sPRN|s"
  478. The quotation marks keep DOS from performing the redirection.
  479.  
  480.                         <page down> for more ECHO
  481. If you execute the command |nECHO|n all by itself with no parameters, it will
  482. say either "ECHO is on" or "ECHO is off".  So how do you get it to send a
  483. blank line  to the screen  from within a batch file?   Well in recent DOS
  484. versions,  it will work if you give  |nECHO|n.  as a command.   That's right,
  485. |nECHO|n-period with no <Space> between.   If that doesn't work for your ver-
  486. sion,  you can try ECHO<Space><F7> which will look like |nECHO|n ^@.   The ^@
  487. is the ASCII 0 character which represents the null character,  looks like
  488. a <Space>,  but isn't a <Space>  and in most DOS versions  will make |nECHO|n
  489. display a blank line.   If you have DOS version 5 though, and you're run-
  490. ning the DOSKEY program,  or if you're running any other version and have
  491. your <F7> key  programmed via ANSI.SYS to stand for something else,  then
  492. <F7> won't give you ^@.  In that case, find out how your text editor goes
  493. about  accepting control characters  in the text,  and use  |nECHO|n <Ctrl-H>
  494. which is a  <Backspace> character.   But if you're using a version of DOS
  495. that's so old that  |nECHO|n. doesn't work,  especially now that Microsoft is
  496. selling DOS 5.0  to the public instead of  only to computer dealers,  you
  497. should go get version 5.0 and find out just what you've been missing!
  498.  
  499.  
  500.                      <page down> for The |nFOR|n Command
  501.                              The |TFOR|T Command
  502.  
  503. This is mainly  a batch file command,  but it is also  very useful at the
  504. DOS prompt.  It works sort of like replaceable parameters.  Example:
  505.           |nFOR|n %%a IN (*.BAT) DO TYPE %%a
  506. What that command will do,  is to expand the wildcard specification *.BAT
  507. into all the filenames that fit it, and then type each one to the screen.
  508. This is useful because the TYPE command does not work on wildcards.
  509.  
  510. How about the DEL command?   It doesn't work on more than one filename at
  511. a time unless the filenames can be named by a wildcard specification.  So
  512. you could do this:
  513.           |nFOR|n %%a IN (FILE1.TXT TEXT2.FIL LETTER3.DOC) DO DEL %%a
  514. This command will replace the %%a in the DEL command,  with each filename
  515. listed in parentheses, in turn, and delete each one.
  516.  
  517. You can also use the %%a variable to fill in for the commands to be exec-
  518. uted, instead of for the parameters to the command.  Like this:
  519.           |nFOR|n %%a IN (|sTYPE|s PAUSE |sDEL|s) DO %%a FILE1.TXT
  520.                          <page down> for more FOR
  521. This command will type  the FILE1.TXT file to the screen,  then pause for
  522. a keystroke,  and then delete the file.   If,  by seeing the file  on the
  523. screen,  you realize that you didn't really want to delete it,  you could
  524. hit <Ctrl-C>  instead of  any other keystroke,  when PAUSE is waiting for
  525. input,  to BREAK out  of the batch file  without deleting FILE1.TXT.   If
  526. you hit anything else  besides <Ctrl-C>  or <Ctrl-Break>,  then FILE1.TXT
  527. will be deleted.
  528.  
  529. Now what would make that particular command really useful, is if you used
  530. a replaceable parameter instead of a particular filename.  Like this:
  531.           |nFOR|n %%a IN (|sTYPE|s PAUSE |sDEL|s) DO %%a %1
  532. Now if that command were in a batch file named D.BAT and you used it with
  533. a command line like D FILE1.TXT, then FILE1.TXT would be placed where the
  534. batch file says %1, or if the next time you executed that batch file, you
  535. said D LETTER.DOC,  then that time LETTER.DOC would be  the file that the
  536. TYPE, PAUSE, and DEL commands would act on.
  537.  
  538. You're probably  wondering why it's not just as good  to use a batch file
  539. like this instead of that one complicated command:
  540.                          <page down> for more FOR
  541.           TYPE %1
  542.           PAUSE
  543.           DEL %1
  544. Well that batch file will do the exact same thing, just less efficiently.
  545. Remember that DOS executes batch files  by reading the first line off the
  546. disk,  then executing it,  then reading the next line off the disk,  then
  547. executing it,  then reading the next line  off the disk,  etc.   In other
  548. words, it's slow.   If you put all three of those commands on one line by
  549. using the  |nFOR|n command,  then you have  a more efficient  batch file.   I
  550. know,  it's only a difference of  a couple milliseconds if you're using a
  551. decent hard drive.   But what if you have a one-floppy-drive system?  And
  552. what if the batch file is on one disk  and the file you want to delete is
  553. on another?   Then you put the batch file disk into the drive and execute
  554. it like  D B:LETTER.DOC  (remember that on  one-floppy-systems,  DOS acts
  555. like you have an A: drive  and a B: drive,  and asks you to  switch disks
  556. when necessary) so the first line of the batch file is read from the disk
  557. and then you are requested to put  the drive B: disk into the drive,  and
  558. the file is typed  to the screen.   Then DOS needs you  to put the  batch
  559. file disk back into the drive so it can read the second line of the batch
  560.                          <page down> for more FOR
  561. file.   Then,  when the third line  of the batch file comes,  you have to
  562. change disks again so that DOS can delete the file.  Then you have to put
  563. the batch file disk in one more time so that DOS can look to see if there
  564. were any more commands in the batch file or not.  Well if the |nFOR|n command
  565. had been used instead, then DOS would only need the batch file disk twice
  566. instead of three times.  (Yeah, I know, big deal, right?)
  567.  
  568. Another way to use replaceable parameters  with the |nFOR|n command is to put
  569. them into the parentheses, like this:
  570.           |nFOR|n %%a IN (%1 %2 %3 %4 %5 %6 %7 %8 %9) DO TYPE %%a > PRN
  571. Now you can specify  anywhere from  one to nine filenames  on the command
  572. line, and they will be typed to the printer, all with just one command.
  573.  
  574. Here's a strange one.   Suppose you need a way to make a batch file pause
  575. for a  couple moments,  without requiring  any keyboard input  to make it
  576. start going again.  How about this:
  577.           |nFOR|n %%a IN (1 2 3 4 5 6 7 8 9 0) DO CHKDSK
  578. Since there's no %%a in the ending part of that command,  the numbers in-
  579. side the parentheses have no effect on the CHKDSK command,  but they just
  580.                          <page down> for more FOR
  581. cause the CHKDSK command to be performed ten times over.   This would put
  582. a decent-length pause into your batch file.  It's not a real good idea to
  583. do it though, because that's a good bit of wear-n-tear on your hard drive
  584. for no good reason.  But it was just an example of how you can use |nFOR|n to
  585. execute the same command some specified number of times.
  586.  
  587. Personally,  I find  the most use  for the |nFOR|n command  at the DOS prompt
  588. rather than inside  batch files,  even though  all the books  usually say
  589. that  |nFOR|n is just  a batch file command.   How about if you want  to copy
  590. eight files that can't be covered in one wildcard specification, from one
  591. disk to another?  Without the |nFOR|n command you have to give the first COPY
  592. command,  wait for that to finish,  give another  COPY command,  wait for
  593. that one, give another command, wait, etc.  Using |nFOR|n instead:
  594.           |nFOR|n %a IN (FILE1.TXT TEXT2.FIL LETTER3.DOC ABCDE.DOC FOOBAR.DOC
  595.                            TEXT6.DOC LETTER7.FIL FILE8.TXT) DO COPY %a B:
  596. Now as long as  that all fits  on a 127-character  command line,  all the
  597. copying will be done while you sit back and watch.
  598.  
  599. Notice  that time I said  %a instead of %%a.   At the DOS prompt you only
  600.                          <page down> for more FOR
  601. want one percent sign (%), while inside a batch file, you need two.
  602.  
  603. You don't have to use  %%a or %a.   You could use %B or %q or %Z or what-
  604. ever you want.   Any letter,  upper or lowercase will do, as long as it's
  605. a letter, and it's the same at the beginning and the end of the same com-
  606. mand.   For example,  |nFOR|n %%a IN (|s*.*|s) DO DEL %%A  won't work because DOS
  607. will be looking for some %%A file to delete,  when all it has is some %%a
  608. files.  DOS does not think of upper and lowercase letters as the same.
  609.  
  610. That was a good command,  though,  if it had the same variable at the be-
  611. ginning and the end.   |nFOR|n %%a IN (|s*.*|s) DO DEL %%a will do the same thing
  612. as DEL *.* but it won't ask you  "Are you sure? (y/n)"  because as far as
  613. the DEL command knows, you're only deleting one file at a time instead of
  614. a whole directory.
  615.  
  616. Just be careful of what you're doing  when you use *.* as the filespec in
  617. the parentheses.  *.* means all files in the current directory.  The cur-
  618. rent directory,  not any other directory.   Suppose you were  in the root
  619. directory of your hard drive and it contains the COMMAND.COM, CONFIG.SYS,
  620.                          <page down> for more FOR
  621. and AUTOEXEC.BAT files.   Now suppose you wanted to delete  all the files
  622. in the current directory of your A: drive and you used the command:
  623.           |nFOR|n %d IN (|s*.*|s) DO DEL A:%d
  624. That's not going to have the effect you expected!  What it's going to try
  625. to delete  is A:COMMAND.COM,  A:CONFIG.SYS,  and A:AUTOEXEC.BAT,  whether
  626. those files exist  on drive A: or not.   It won't even try  to delete any
  627. other files on the A: drive.   Because *.* doesn't mean the same thing as
  628. A:*.* at all.  The command you wanted there was:
  629.           |nFOR|n %d IN (A:*.*) DO DEL %d
  630.  
  631. Here's another real useful thing you can do with the |nFOR|n command.  If you
  632. have two directories that contain some of the same files, and suppose you
  633. want directory A to keep all of its files, but you want to delete all the
  634. files that are in the B directory that are also in A.  After you check to
  635. make sure  that the files  that have matching names  really are the exact
  636. same files (with the COMP command, perhaps), then you could type:
  637.           |nFOR|n %d IN (|s*.*|s) DO DEL \B\%d
  638. from the A directory,  and that would delete anything in B that's also in
  639. the A directory.   Of course there will be some "File not found" messages
  640.                          <page down> for more FOR
  641. during that process, for files that are in A but not in B, but that's ok.
  642.  
  643. In many ways, the |nFOR|n command acts like a miniature batch file, even when
  644. you're using it from the DOS prompt.  For example, if you want to use the
  645. |nFOR|n command to execute a batch file,  you have to use the CALL or COMMAN|1D
  646. command, even if you're working at the command line instead of within an-
  647. other batch file.   Without CALL or COMMAN|1D, the batch file will be exec-
  648. uted with the first parameter in the set in parentheses,  and then you'll
  649. get your DOS prompt back.  DOS will think it's done with what you told it
  650. to do because the batch file it was working on has finished.  The CALL or
  651. COMMAN|1D /C command will cause the batch file,  when it's done,  to return
  652. control to the |nFOR|n command instead of to the DOS prompt.  Here's an exam-
  653. ple, supposing you have a batch file named |nBATCH|n.BAT:
  654.           |nFOR|n %a IN (|s*.*|s) DO CALL |nBATCH|n %a
  655. And of course,  |nBATCH|n.BAT must have a %1 replaceable parameter inside it,
  656. or else there's no point  in trying to feed it a %a parameter.   So,  the
  657. CALL command is not completely useless  at the DOS prompt after all,  the
  658. way most people think it is!
  659.  
  660.                      <page down> for The |nGOTO|n Command
  661.                              The |tGOTO|t Command
  662.  
  663. This is  a batch file  command,  which has no purpose  at the DOS prompt.
  664. But in a batch file,  it's a  great command.   It sends the  execution to
  665. some other part of the batch file, instead of continuing on with the com-
  666. mands as they are listed in order.
  667.  
  668. Suppose that you want to perform  a certain set of commands  based on the
  669. results of an IF test.  Like this, perhaps:
  670.           @|sECHO|s OFF
  671.           IF EXIST AUTOEXEC.BAT |nGOTO|n YES
  672.           (here go the commands that you want performed if the file AUTO-
  673.                  EXEC.BAT does not exist in the current |sdirectory|s)
  674.           |nGOTO|n END
  675.           :YES
  676.           (here go the commands  that you want performed  if AUTOEXEC.BAT
  677.           does exist in the current |sdirectory|s)
  678.           :END
  679. The word that comes after  the |nGOTO|n command  is called a label,  and when
  680.                         <page down> for more GOTO
  681. the label  is later repeated  in the batch file,  at the point where  you
  682. want the |nGOTO|n to jump to,  the label must be  preceded by a  colon (:) as
  683. shown in that example.   Also,  don't forget the |nGOTO|n END statement after
  684. the "no" commands,  or else the "yes" commands will be executed after the
  685. "no" commands are finished.   And if you have a |nGOTO|n END statement,  then
  686. you sure do  have to  remember to  put the  :END label  in the batch file
  687. somewhere,  or you'll get a  nasty "Label not found"  error message,  and
  688. the batch file will just quit and leave you with a DOS prompt.
  689.  
  690. Another good use for the |nGOTO|n command  is in conjunction with replaceable
  691. parameters.  You can use |nGOTO|n %1 at the beginning of your batch file, and
  692. that way you could combine all of your little batch files  into one great
  693. big batch file,  to save disk space (since every file takes a whole clus-
  694. ter of disk space even if the file is only 17 bytes long).  Let's say you
  695. have batch files named 1.BAT,  2.BAT,  and 3.BAT  and you want to combine
  696. them into one batch file called GO.BAT.  Here's how:
  697.           @|sECHO|s OFF
  698.           IF NOT '%1==' |nGOTO|n %1
  699.           ECHO The syntax of this command is %0 followed
  700.                         <page down> for more GOTO
  701.           ECHO by a label, where the available labels are
  702.           ECHO 1, 2, and 3.   For example, to perform the
  703.           ECHO tasks that used to be in 1.BAT,  you enter
  704.           ECHO %0 1
  705.           |nGOTO|n END
  706.           :1
  707.           (here go the commands that used to be in 1.BAT)
  708.           |nGOTO|n END
  709.           :2
  710.           (here go the commands that used to be in 2.BAT)
  711.           |nGOTO|n END
  712.           :3
  713.           (here go the commands that used to be in 3.BAT)
  714.           |nGOTO|n END
  715.           :END
  716. (See the sections on ECHO, IF, and Replaceable Parameters for more infor-
  717. mation.)
  718.  
  719. So now you can delete your 1.BAT,  2.BAT,  and 3.BAT files  (after you've
  720.                         <page down> for more GOTO
  721. tested  to make sure  that your new GO.BAT file  works right) and free up
  722. two |scluster|ss of disk space.   Because GO.BAT is still small enough to fit
  723. all in one cluster, so it's only taking up as much space as 1.BAT used to
  724. take up by itself.
  725.  
  726. Notice that  in a batch file,  %0 always refers to  the name of the batch
  727. file  that the %0  is inside of.   So in that example above,  every place
  728. that says  "%0"  in the batch file  will be replaced with  "GO"  when you
  729. actually run  the batch file.   But if you  change the name  of the batch
  730. file to MENU.BAT,  then you won't have to change  the inside of the batch
  731. file, because now every place that says "%0" will say "MENU" instead.
  732.  
  733. Remember that only the first 8 characters  of a label are noticed by DOS,
  734. so |nGOTO|n REMEMBER1 is the same as |nGOTO|n REMEMBER2, as far as DOS is concer-
  735. ned.   Having two different labels that are only different in their ninth
  736. character does no good.   Also,  every time DOS goes looking  for a label
  737. that a  |nGOTO|n command pointed to,  it starts at the very beginning  of the
  738. file,  and glances at each line,  so if you have a  :HERE label  near the
  739. beginning of the file and a :HERE label near the end,  the one at the be-
  740.                         <page down> for more GOTO
  741. ginning is the only one DOS will ever go to.
  742.  
  743. You can also use labels as comments,  just like the REM command,  because
  744. if there is no |nGOTO|n command that points to a particular label,  DOS won't
  745. mind,  or even notice it.   DOS completely ignores  any line  that starts
  746. with a colon (:), unless it's looking for a specific label because a |nGOTO|n
  747. command told it to.   You can write anything you want in a batch file af-
  748. ter a colon, as long as you have the correct label for every |nGOTO|n command
  749. in the file,  it doesn't matter if you also have  seventy more  labels if
  750. you want to.   You can also add comments on the same line with a real la-
  751. bel, because DOS is only going to pay attention to the first word follow-
  752. ing the colon.   As long as there is a <Space> between the real label and
  753. the comments, DOS won't care.
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.                       <page down> for The |nIF|n Command
  761.                               The |TIF|T Command
  762.  
  763. This is a batch file command,  which almost never has  any use at the DOS
  764. prompt.  It causes the following command to be executed or ignored, based
  765. on whether or not the |nIF|n statement is true.
  766.  
  767. There are  several types  of |nIF|n statements,  and each of them can be used
  768. with a |TNOT|T qualifier.  Let's take each type separately.
  769.  
  770. First,  there is  "IF |TEXIST|T".   This is used to check on whether or not a
  771. certain filename exists  in the current or specified directory.   Suppose
  772. you are in the C:\ directory  and you do have a file named C:\CONFIG.SYS,
  773. the command  |nIF|n |nEXIST|n CONFIG.SYS ECHO YES,  in a batch file,  would cause
  774. the word YES to appear on your screen.   The command  |nIF|n |nNOT|n |nEXIST|n CONFIG
  775. .SYS ECHO NO would cause nothing at all to happen,  since CONFIG.SYS does
  776. exist.
  777.  
  778. You can also use this method  to determine whether a file  exists in some
  779. other directory, by saying |nIF|n |nEXIST|n C:\DOS\MODE.COM ECHO YES.
  780.                          <page down> for more IF
  781. It is also possible to determine whether a directory exists,  even though
  782. you can't say something like  |nIF|n EXIST C:\DOS ECHO YES because that would
  783. cause DOS to look for a file named DOS in the root directory, rather than
  784. looking for a directory named DOS.  Here's how it can be done:
  785.           |nIF|n EXIST C:\DOS\NUL ECHO YES
  786. NUL is a sort of  an imaginary device that DOS uses,  and it does sort of
  787. exist in every directory on your disk.  Of course you will not find it in
  788. a directory listing,  but it is sort of there as far as DOS is concerned,
  789. so that |nIF|n test will report that the C:\DOS directory does exist, whether
  790. or not there are any files in it.
  791.  
  792. Next, there is "IF X==X".  This is used to check on whether two things're
  793. the same or not.  Notice that you always need to use two equals (=) signs
  794. together  and that you shouldn't  leave any spaces  on each side of them.
  795. This comparison is case sensitive, so X and x would not be a match!
  796.  
  797. The only time this is the least bit useful  is when one of the items is a
  798. replaceable parameter  or an environment variable.   (See  the batch file
  799. section for more information about using environment variables.)  Now you
  800.                          <page down> for more IF
  801. also need to use some sort of a dummy character,  in case the variable or
  802. parameter was not supplied.  For example, if you had forgotten to set the
  803. ONE variable before executing the following batch file command:
  804.           |nIF|n %ONE%==YES GOTO NEXT
  805. then DOS would expand that line to say  |nIF|n ==YES GOTO NEXT because if ONE
  806. was not set,  then it is  equal to  nothing.   This line will  give you a
  807. major syntax error.  But if you had instead said:
  808.           |nIF|n !%ONE%==!YES GOTO NEXT
  809. and you still forgot to  SET ONE=YES before running the batch file,  then
  810. DOS would  expand that line to say  |nIF|n !==!YES GOTO NEXT.   Well that may
  811. not  have been  the result  you had intended,  but at least  it is not an
  812. error message.   You can use  just about  any character you want  for the
  813. dummy character, not just the exclamation point that I used in that exam-
  814. ple.  As long as you put the same character on each side of the == signs,
  815. it will work.
  816.  
  817. Another use for the dummy character  is with replaceable parameters.   To
  818. make sure that the user  of the batch file  remembers to type a parameter
  819. on the command line, you could do this:
  820.                          <page down> for more IF
  821.           |nIF|n !%1==! GOTO FORGOT
  822. Because if there was no parameter on the command line,  then DOS will ex-
  823. pand  that line  to say  |nIF|n !==! GOTO FORGOT,  and ! does indeed equal !.
  824. Then under the :FORGOT label,  you might want to use some ECHO statements
  825. to tell the user how the batch file should have been run.   (See the GOTO
  826. section for an example.)
  827.  
  828. Then there is "IF |TERRORLEVEL|T".  A lot of programs return an |nERRORLEVEL|n to
  829. DOS after they complete whatever function  they were supposed to perform,
  830. and that |nERRORLEVEL|n can be used in a batch file.   For example, the DISK-
  831. |nCOPY|n command returns  an |nERRORLEVEL|n of 1, 2, 3, or 4,  if the command was
  832. not successful, or an |nERRORLEVEL|n of 0 if it was.   Well the |nIF|n |nERRORLEVEL|n
  833. test is positive if the |nERRORLEVEL|n is the same or higher as the one spec-
  834. ified, so a batch file like:
  835.           DISKCOPY A: A:
  836.           |nIF|n NOT |nERRORLEVEL|n 1 GOTO OK
  837.           ECHO Something went wrong!
  838.           GOTO END
  839.           :OK
  840.                          <page down> for more IF
  841.           ECHO It worked!
  842.           :END
  843. will always report "Something went wrong!"  if |sDISKCOPY|s's ERRORLEVEL is 1
  844. or higher, or "It worked!" if the ERRORLEVEL is less than 1.
  845.  
  846. Other DOS commands  that return ERRORLEVEL codes,  are BACKUP,  DISKCOMP,
  847. DISKCOPY, FORMAT,  GRAFTABL, KEYB,  REPLACE, RESTORE,  SETVER, TREE,  and
  848. XCOPY.  Any ERRORLEVEL higher than zero means that some error occurred.
  849.  
  850. There are quite a few little public domain utilities  that can be used in
  851. a batch file to perform some action  based on keyboard input.   For exam-
  852. ple, a little program from the 2/90 issue of PC/Computing magazine called
  853. ASK.COM (watch out because I've seen other versions of commands named ASK
  854. .COM that didn't work quite the same way),  is used like this to retrieve
  855. a Yes or No from the user during execution of a batch file:
  856.           @|sECHO|s OFF
  857.           ECHO Do you want to load your screen saver into |smemory|s?   (Y/n)
  858.           ASK
  859.           |nIF|n ERRORLEVEL 1 GOTO YES
  860.                          <page down> for more IF
  861.           GOTO NO
  862.           :YES
  863.           (Command here to load screen saver)
  864.           GOTO END
  865.           :NO
  866.           (Command here for if screen saver is not loaded)
  867.           :END
  868. The ASK.COM program looks to the keyboard to see which key you press.  If
  869. it is Y or y,  an ERRORLEVEL  of 2 is returned.   If it is  <Enter>,  the
  870. ERRORLEVEL is 1.   If you press N or n,  the ERRORLEVEL is 0.   So in the
  871. sample batch file above, if you press Y, y, or <Enter>,  an ERRORLEVEL of
  872. 1 or higher will be returned,  so the GOTO YES command  will be executed.
  873. If you press N or n,  the ERRORLEVEL will be  0 which is less than 1,  so
  874. the GOTO YES command will be ignored  and the next line,  GOTO NO will be
  875. executed instead.
  876.  
  877. What if the question were instead  in reference to something to which the
  878. answer will more often be No rather than Yes?  You would want the default
  879. chosen by the <Enter> key to be No instead.  You could do that like this:
  880.                          <page down> for more IF
  881.           @|sECHO|s OFF
  882.           ECHO Do you want to run |sCHKDSK|s?  (y/N)
  883.           ASK
  884.           |nIF|n ERRORLEVEL 2 GOTO YES
  885.           GOTO NO
  886. This time, since the |nIF|n ERRORLEVEL command specifies 2, the GOTO YES com-
  887. mand will only be executed if the Y or y keys are pressed.  Anything else
  888. like N, n, or <Enter>, will return an ERRORLEVEL of 1 or 0 which is lower
  889. than 2,  so the GOTO YES command  will be ignored and the GOTO NO command
  890. will be executed instead.
  891.  
  892. You could also use the ASK.COM program  for a purpose that required three
  893. separate options.  Like this:
  894.           @|sECHO|s OFF
  895.           ECHO If you want choice A, press Y or y.
  896.           ECHO If you want choice B, press [Enter].
  897.           ECHO If you want choice C, press N or n.
  898.           ASK
  899.           |nIF|n ERRORLEVEL 2 GOTO YES
  900.                          <page down> for more IF
  901.           |nIF|n ERRORLEVEL 1 GOTO ENTER
  902.           GOTO NO
  903. Now don't forget to put those ERRORLEVEL statements in the correct order!
  904. Since an |nIF|n ERRORLEVEL statement is true if the ERRORLEVEL is the same or
  905. higher than the one specified, then if you did it like this:
  906.           |nIF|n ERRORLEVEL 1 GOTO ENTER
  907.           |nIF|n ERRORLEVEL 2 GOTO YES
  908. then any time the  ERRORLEVEL is 1 or 2,  the GOTO ENTER  command will be
  909. executed, and so DOS will never see the |nIF|n ERRORLEVEL 2 command.
  910.  
  911. Now remember that  ASK.COM is not a part of DOS,  so you can't use any of
  912. those batch files unless you get that utility.   But since DOS did such a
  913. lousy job  of making use  of its own  ERRORLEVEL parameter,  I had to use
  914. that third-party utility as an example of what ERRORLEVEL could do.
  915.  
  916. You can even nest one |nIF|n command inside another, as in:
  917.           |nIF|n ERRORLEVEL 2 |nIF|n NOT ERRORLEVEL 3 GOTO TWO
  918. Now if the ERRORLEVEL were 1,  then the first |nIF|n test would fail,  so the
  919. second one would not even be noticed by DOS.   But if the ERRORLEVEL were
  920.                          <page down> for more IF
  921. 2, then the first |nIF|n test would pass, and then the second test would also
  922. pass since it  includes the NOT qualifier,  so the GOTO command  would be
  923. executed.  And if the ERRORLEVEL were 3 then the first |nIF|n test would pass
  924. but the second one would fail, so the GOTO command would be ignored.
  925.  
  926.  
  927.  
  928.  
  929.  
  930.  
  931.  
  932.  
  933.  
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940.                     <page down> for The |nPAUSE|n Command
  941.                             The |TPAUSE|T Command
  942.  
  943. This command is  only useful in a batch file.   You can put  this command
  944. into any batch file,  and when  it executes,  when DOS gets  to the |nPAUSE|n
  945. line, it will write "Press any key to continue . . ." on your screen, and
  946. it will just sit and wait for you to press a key.   If you press <Ctrl-C>
  947. or <Ctrl-Break>,  then DOS will allow you  to BREAK out of the batch file
  948. and go back to the DOS prompt  without finishing the rest of the commands
  949. in the batch file.   Or,  when DOS asks you  "Terminate batch job (Y/N)?"
  950. you can say N instead,  and DOS will continue on with the next command in
  951. the batch file  after the one that  DOS was working on,  at the time  you
  952. pressed  <Ctrl-Break> or <Ctrl-C>,  which in this case was the |nPAUSE|n com-
  953. mand.   Well if, instead of one of those two keystroke combinations,  you
  954. press any other key,  then the batch file  will continue on  with what it
  955. was doing.
  956.  
  957. This is especially useful for three purposes.   First,  whenever you need
  958. to allow  the user a moment  to do something like  put a different floppy
  959. disk into drive A: or turn the printer on.
  960.                         <page down> for more PAUSE
  961. Second, whenever you want to be sure to allow the user the opportunity to
  962. BREAK out of the batch file with the <Ctrl-C> keystroke.  The <Ctrl-C> or
  963. <Ctrl-Break>  keystroke generally allows  anyone to break out  of a batch
  964. file at any time, more or less, but if you want to be absolutely sure the
  965. user will be able to get out if desired,  at a certain point in the batch
  966. file,  without a doubt,  then put a |nPAUSE|n command  into the batch file at
  967. that point.
  968.  
  969. Third,  whenever you're working on creating a batch file,  and you're not
  970. sure you have the exactly correct commands in it, you can remove the ECHO
  971. OFF line from the beginning,  if you had it there,  and insert |nPAUSE|n com-
  972. mands every two  or three lines,  so that you  can execute the batch file
  973. and watch what happens  without trying  to read the screen  so fast as it
  974. scrolls by.   You'll have plenty of time  to look and see  what the batch
  975. file is doing, so you can figure out which parts aren't working right.
  976.  
  977. You can type whatever you want after the |nPAUSE|n command,  on the same line
  978. with it, without affecting anything.   If ECHO is on, then the whole com-
  979. mand, including whatever you might have typed after it, will be displayed
  980.                         <page down> for more PAUSE
  981. on the screen.   But if echo is off,  only the message  "Press any key to
  982. continue . . ." will show up,  so you probably want  to precede the |nPAUSE|n
  983. command in the batch file  with an ECHO command  to tell the user what it
  984. is that DOS is pausing to wait for.
  985.  
  986. You might want  to make the  computer's speaker  beep along with  a |nPAUSE|n
  987. command,  to alert the user that the computer is waiting for a keystroke,
  988. in case  he walked off  to do something else  while that batch file exec-
  989. utes.  To put a beep into a batch file, you need ASCII character 7, which
  990. is called BEL.  To enter an ASCII character 7 you can hold down the <Alt>
  991. key and type a 7 on the numeric keypad.   If a ^G appears on your screen,
  992. you know it worked.   (Some text editors won't properly accept such input
  993. from the <Alt-number> method.)   If you're using EDLIN  to create a batch
  994. file, there's another way to do it also.   Just type ECHO ^VG where the ^
  995. symbol means  to hold down  the <Ctrl> key  while typing the next letter.
  996. The ^V tells EDLIN that the next character you enter should be interpret-
  997. ed as a  control character,  so ^VG puts the  ASCII 7  character into the
  998. file.   (The next time you  list that file  to the screen,  the V will be
  999. missing,  but that's ok;  it's served its purpose  and the computer knows
  1000.                         <page down> for more PAUSE
  1001. now  that the G  is really supposed to be  a <Ctrl-G>  or BEL character.)
  1002. Now whenever you type that file  to the screen with the TYPE command,  or
  1003. execute it  by typing the name  of the batch file  itself,  your computer
  1004. will ring its bell  (beep its speaker)  instead of showing the  ^G on the
  1005. screen.   So just put  the |nPAUSE|n  command  right after  that line,  or of
  1006. course,  if your batch file  does not have  ECHO off,  you can just place
  1007. these ASCII 7 or ^G characters on the |nPAUSE|n command line instead of using
  1008. a separate ECHO command.
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016.  
  1017.  
  1018.  
  1019.  
  1020.                      <page down> for The |nREM|n Command
  1021.                              The |TREM|T Command
  1022.  
  1023. This command has no use except in the CONFIG.SYS file or in a batch file.
  1024. It stands for REMark.  All it does is tell DOS to "ignore this line".  So
  1025. that you can insert little comments into your CONFIG.SYS and batch files,
  1026. to remind you of what a certain command is supposed to accomplish, so you
  1027. don't wonder six months from now why you wrote what you did.
  1028.  
  1029. Also, if you want to temporarily disable a line from a batch file or from
  1030. the CONFIG.SYS file, without removing it permanently, you just insert the
  1031. word |nREM|n and a <Space> at the beginning of the line,  and DOS will ignore
  1032. that line when it executes the file.   Of course in a batch file, an even
  1033. easier way  to temporarily disable  a line is to just  put a colon (:) in
  1034. front of it.   That way,  DOS will think  it's just a label  for the GOTO
  1035. command,  so DOS will totally ignore  that line  as long as there isn't a
  1036. GOTO command in the file  that uses a label by the same name as the first
  1037. word in the line you're disabling.
  1038.  
  1039. If you want the REMark to display on the screen as a batch file executes,
  1040.                          <page down> for more REM
  1041. you have to have echo on.  In fact, if echo is on, |nREM|n is the best way to
  1042. display a line on the screen,  because the ECHO command  will display the
  1043. line twice if echo is on.
  1044.  
  1045. |nREM|n was not a valid CONFIG.SYS command until DOS version 4, so if you use
  1046. it in a CONFIG.SYS file in an earlier version,  you'll get an error mess-
  1047. age  "Unrecognized command",  but it won't  hurt anything.   It will only
  1048. look like  something is wrong  with your CONFIG.SYS file  as it executes.
  1049. As long as there's only the one error message, and you remember that it's
  1050. because of the "REMmed out" statement then you'll be fine.  Which reminds
  1051. me,  I'd better warn you that a lot of people  will go around telling you
  1052. to "REM out" a line in a CONFIG.SYS or batch file,  and expect you to un-
  1053. derstand what they're talking about.   Well what they're talking about is
  1054. just putting the word |nREM|n and a <Space> in front of the line in question,
  1055. so that DOS will ignore that line the next time the file gets executed.
  1056.  
  1057. It's not totally true though, that DOS will ignore everything on the rest
  1058. of a line that starts with |nREM|n.   Redirection symbols  (>, <, and ||) will
  1059. be interpreted on a |nREM|n command the same way as on any other command.
  1060.                     <page down> for The |nSHIFT|n Command
  1061.                             The |TSHIFT|T Command
  1062.  
  1063. This  is a batch file command  which has  no use  whatsoever  at the  DOS
  1064. prompt.   Its only purpose is in conjunction with replaceable parameters.
  1065. All it does is shift everything over to the left.  Huh?
  1066.  
  1067. Well,  suppose you are using a whole bunch of replaceable parameters in a
  1068. batch file.   All that's strictly allowed is  %0 to represent the name of
  1069. the batch file,  and then %1 through %9 for whatever you want to use them
  1070. for.  What if you need more than nine?  That's what |nSHIFT|n is for.  Here's
  1071. the command line we'll use for an example:
  1072.             D 1.TXT 2.TXT 3.TXT 4.TXT 5.TXT 6.TXT 7.TXT 8.TXT 9.TXT 0.TXT
  1073. Well, the name of the batch file, D, is %0.   The first parameter, 1.TXT,
  1074. is %1, the second one, 2.TXT, is %2, etc., up until the tenth one, 0.TXT,
  1075. which doesn't have any %# because there's no such thing as %10.   So, how
  1076. are we going to use it?  Well, as soon as we are done, in the batch file,
  1077. with  whatever we needed to do  to %1 through %9,  we could use the |nSHIFT|n
  1078. command which will move everything over one space to the left.   The name
  1079. of the batch file  will no longer have any %#, 1.TXT will become %0,  and
  1080.                         <page down> for more SHIFT
  1081. 2.TXT is now %1, etc.,  up until 0.TXT becomes %9.   Now 0.TXT can have a
  1082. %# even though it's the eleventh word on the command line.  If there were
  1083. another file, say 11.TXT, on the command line, then another |nSHIFT|n command
  1084. would make 1.TXT not have any %#,  and 2.TXT would be %0,  3.TXT gets %1,
  1085. etc.,  until 0.TXT is %8 and 11.TXT is %9.   So it is conceivable to have
  1086. an unlimited number of parameters on the command line (as long as the to-
  1087. tal length of the command line is 127 characters or less).  You just need
  1088. to have as many |nSHIFT|n commands  in the batch file as there are parameters
  1089. past the ninth one.
  1090.  
  1091. The |nSHIFT|n command  also comes in handy when you want to do the exact same
  1092. thing to a whole bunch of parameters,  and you could be using a different
  1093. number of parameters each time.   Let's use that same sample command line
  1094. above, and say that D.BAT looks like this:
  1095.           :START
  1096.           DEL %1
  1097.           |nSHIFT|n
  1098.           IF !%1==! GOTO END
  1099.           GOTO START
  1100.                         <page down> for more SHIFT
  1101.           :END
  1102. Well,  the first line  is just a label  for the  GOTO command.   Since it
  1103. starts with a colon (:), it will be completely ignored until such time as
  1104. DOS sees the GOTO command,  so having it as the first line is not a prob-
  1105. lem.  The next line just deletes the file that currently has the value of
  1106. %1.  Right now, since there has not been any |nSHIFT|n command yet, it is the
  1107. first word  after the name  of the batch file  on the command line.   The
  1108. next line shifts everything  on the command line,  one space to the left,
  1109. so that what was %1 is now %0, what was %2 is now %1, etc.  The next line
  1110. checks to see if we're done yet.   If, after the shift,  there is nothing
  1111. left to put into %1,  then DOS will expand this line to say  IF !==! GOTO
  1112. END  (because %1 is now "nothing")  and since  ! does equal !,  the batch
  1113. file will GOTO END.   But if there is still something left on the command
  1114. line after the shift,  so that %1 does not  equal nothing,  then the line
  1115. will be expanded to say,  for example,  IF !2.TXT==! GOTO END,  and since
  1116. !2.TXT does not equal !,  the GOTO END command  will be ignored,  and the
  1117. GOTO START  command will be  executed instead.   This just keeps on going
  1118. until  however many files  were included  on the command line,  have been
  1119. deleted, at which time %1 is equal to nothing, and the batch file ends.
  1120.                  <page down> for Input/Output |nRedirection|n
  1121.                          Input/Output |tRedirection|t
  1122.                          
  1123. Hey, this is a really useful subject!   Well, to redirect something means
  1124. to take something that was supposed to come from or go to a certain place
  1125. and take it from or send it to a different place instead.  STanDard INput
  1126. (called STDIN for short) usually comes from the keyboard, so input redir-
  1127. ection means to make the input come  from somewhere else instead.   STan-
  1128. Dard OUTput (also called STDOUT)  usually goes to the monitor,  so output
  1129. |nredirection|n means to make the output go to somewhere else instead.  Pret-
  1130. ty simple concept, huh?
  1131.  
  1132. For input |nredirection|n, the symbol is <.  For example, suppose you want to
  1133. delete a whole directory full of files, from within a batch file.  If the
  1134. batch file gives the command DEL C:\TEMP\*.* then the DEL command's going
  1135. to ask "Are you sure? (Y/N)"  and sit there waiting for Y or N input from
  1136. the keyboard.   Well if you know that the answer to that question is def-
  1137. initely going to always be Y,  then you can create  a little file on your
  1138. disk that contains nothing but a Y and carriage return (the <Enter> key),
  1139. and name that file Y.TXT,  and make the STDIN for that question come from
  1140.                      <page down> for more Redirection
  1141. that file instead of from the keyboard,  and then the batch file can con-
  1142. tinue on its merry way  without your having to press  a Y or N key,  like
  1143. this:
  1144.           DEL C:\TEMP\*.* < Y.TXT
  1145.  
  1146. Of course the DEL part has to come first,  because that's the name of the
  1147. command, so in order to get Y.TXT pointing toward the command,  use the <
  1148. symbol.  Now when the DEL command tells DOS that it wants some STDIN from
  1149. the keyboard, DOS is going to give the input from the Y.TXT file instead,
  1150. because the DEL command won't know the difference as long as it gets some
  1151. input.   Just make sure that the Y.TXT file is either in the current dir-
  1152. ectory, or else specify the path to the directory on the command line, as
  1153. in  DEL C:\TEMP\*.* < C:\BELFRY\Y.TXT,  or else DOS won't be able to find
  1154. the Y.TXT file and that will lock up the computer totally.
  1155.  
  1156. Another time  that input |nredirection|n  is really useful,  is with the MORE
  1157. command.   This command takes STDIN and sends it  to STDOUT 23 lines at a
  1158. time.   That doesn't do much good at all  unless STDIN is redirected from
  1159. somewhere else besides the keyboard.   You can read a long text file, one
  1160.                      <page down> for more Redirection
  1161. page at a time, with this command:
  1162.           MORE < FILENAME.EXT
  1163. Notice that the < symbol  causes the file to be pointing  toward the MORE
  1164. command.   If you were to accidentally type the > symbol instead the MORE
  1165. command would send STDOUT to the file,  instead of taking STDIN  from the
  1166. file, and that would effectively erase every byte of data from that file.
  1167. Make sure the symbol points from the file toward the command!
  1168.  
  1169. Now make sure you understand  that once you redirect STDIN from somewhere
  1170. toward a command,  that command is not going to accept any input from the
  1171. keyboard,  because it's taking all of its input from the place you redir-
  1172. ected it from.  If a command takes some input and then does something and
  1173. then asks for some more input,  that second piece of input  has got to be
  1174. in the same place  that the first piece was in,  or else the command will
  1175. sit there all day waiting for the second piece of input to come from that
  1176. same place.   The command won't pay the slightest bit of attention to the
  1177. keyboard, because you told it to take its input from somewhere else.   So
  1178. make sure that if you write  a little file like Y.TXT  for a purpose that
  1179. requires  more than one piece of input,  that you put all the input  that
  1180.                      <page down> for more Redirection
  1181. will be needed for the entire command, into that file.
  1182.  
  1183. For example, the FORMAT command asks you first to place the disk into the
  1184. drive and press <Enter>,  and then it starts formatting.   So suppose you
  1185. were to make a file that contained  just a carriage return,  and you used
  1186. the command FORMAT A: < CR.TXT to redirect that file into the FORMAT com-
  1187. mand.   Well it will start out working just fine, but when the formatting
  1188. is done FORMAT is going to ask you "Format another? (Y/N)" and it's going
  1189. to sit there forever waiting for the Y or N to come from that CR.TXT file
  1190. and the only thing you can do about it  is reboot the computer.   Run the
  1191. command a few times first,  to make sure you know exactly  what input the
  1192. command is going to want,  before you create a file  to redirect into it!
  1193. (The DOS version 5 FORMAT command  is not a good candidate  for input re-
  1194. direction,  because under different circumstances it will ask for differ-
  1195. ent input.   For example,  if a disk doesn't have enough free space on it
  1196. for the MIRROR.FIL file,  then FORMAT will ask  if you want  to format it
  1197. anyway,  even though it won't be |sUNFORMAT|stable,  so your little text file
  1198. won't be able to deal with that question if it comes up!)   It won't mat-
  1199. ter if the text file being redirected into a command has too much data in
  1200.                      <page down> for more Redirection
  1201. it,  as long as all the data the command is going to need is there and in
  1202. the right order.  You can put fifty extra characters into the file if you
  1203. want, and nobody will care, as long as they come after the parts that the
  1204. command is going to want.
  1205.  
  1206. The MORE command requests the data that it is to display,  from the STDIN
  1207. device, so if the STDIN has been redirected from somewhere other than the
  1208. the keyboard,  then that's where MORE will take its input from.   But for
  1209. the keystroke that tells MORE to display the next screenful, MORE doesn't
  1210. request that particular piece of input from STDIN,  it looks right at the
  1211. keyboard instead,  for that piece of input.   So that's why you can still
  1212. "press any key to continue"  even though STDIN has been redirected.   But
  1213. for any command that takes all of its input from STDIN, then in that case
  1214. the keyboard will be totally ignored when input is redirected, until that
  1215. particular command completes and exits back to DOS.
  1216.  
  1217. Another use for input |nredirection|n is when you've temporarily disabled CON
  1218. (that's the name for the CONsole device which means monitor-and-|skeyboard|s)
  1219. with the CTTY command,  and you need to take just one little piece of in-
  1220.                      <page down> for more Redirection
  1221. put from the keyboard.  For example, PAUSE < CON so that you will be able
  1222. to use the keyboard to "Press a key when ready . . ." because PAUSE,  un-
  1223. like MORE, looks to STDIN for that keystroke, rather than the keyboard.
  1224.  
  1225. Output |nredirection|n is even more useful!   You can take all the stuff that
  1226. a command usually sends to STDOUT, and send it to a file,  or to a print-
  1227. er, or to your modem,  or even to a place called NUL which means nowhere.
  1228. Now this will not effect STDERR,  which means  the place where  a command
  1229. sends ERRor messages to.   Those will still go to the monitor,  even when
  1230. STDOUT is redirected elsewhere.  But little messages like "1 File(s) cop-
  1231. ied" can be sent to NUL  so you don't have to look at them on the screen.
  1232. The output of the MEM command can be sent to a printer so you can take it
  1233. over to your friend's house,  and show him  how much free memory you have
  1234. now that you installed  DOS version 5.   The entire output  of the CHKDSK
  1235. command can be sent to a disk file so that you can look at it later.  But
  1236. you have to watch it  with that one,  though,  because that does mean the
  1237. entire output.  If CHKDSK runs into any errors on your disk, it will send
  1238. the message about  "Convert lost chains to files? (Y/N)" to the disk file
  1239. where you won't be able to see it.  You won't even realize that CHKDSK is
  1240.                      <page down> for more Redirection
  1241. sitting there waiting for you to answer the question.  You can say Y or N
  1242. or you can say <Ctrl-C>  to BREAK out of the CHKDSK command,  but it will
  1243. take you a minute to realize that you need to do such a thing.  Of course
  1244. you'd better use the <Ctrl-C> method though,  because you don't know what
  1245. question CHKDSK is waiting for an answer to.   Well here are the commands
  1246. you would use to perform those tricks:
  1247.           COPY FILENAME.EXT D: > NUL
  1248.           MEM /C > PRN
  1249.           CHKDSK C:*.* /V > FILENAME.EXT
  1250.  
  1251. See,  the little arrow points in the direction in which you want the flow
  1252. to occur.  We're sending output away from the command and toward the file
  1253. or toward the device|1s, so we're using the > symbol.
  1254.  
  1255. Make sure you understand that if the recipient of the > symbol is a file-
  1256. name,  and there already exists  a file by that name,  whatever that file
  1257. contains  is going to be irrevocably lost  the second you hit the <Enter>
  1258. key to execute that command.   Because whenever DOS sees an output redir-
  1259. ection symbol,  the very first thing  that happens is that  DOS opens the
  1260.                      <page down> for more Redirection
  1261. file that's referred to  in the command,  and dumps the contents  of that
  1262. file into  the "bit-bucket"  (trash can).   Whenever the  > symbol points
  1263. toward a filename, the file is created if it doesn't exist already, or if
  1264. it does exist, it is erased.   Wiped out.  Immediately.   Before DOS even
  1265. looks at the rest of what you typed on that command line.  Also, if there
  1266. doesn't end up being any STDOUT directed toward that file,  the file will
  1267. still exist  because DOS created it  as soon as you hit  the <Enter> key.
  1268. For example,  if you typed  DEL FILENAME.EXT > TEST,  then the file named
  1269. TEST will be created  even though there is no output from  a command like
  1270. DEL FILENAME.EXT.  TEST will just be a zero-length file, but it will have
  1271. a directory entry even though it won't take up any disk space.
  1272.  
  1273. If a file already exists  and you want to add  some more data to it,  you
  1274. can use a double >> sign, like this:
  1275.           MEM /C >> MEMCHKS.TXT
  1276. Whenever DOS sees a double >> sign,  that means to create the file  if it
  1277. doesn't already exist, or add more data to the end of the file if it does
  1278. already exist, which is called appending the data to the file.
  1279.  
  1280.                      <page down> for more Redirection
  1281. Now all these |nredirection|n examples so far  have involved one command  and
  1282. one device or filename.   What if you want to redirect one command to an-
  1283. other?   That's what the third type  of |nredirection|n is for.   It's called
  1284. |tpiping|t and it uses the pipe symbol which looks like ||.   That's the char-
  1285. acter on top of the \ key,  so if you hold down  a <Shift> key and type \
  1286. you'll get || and that's a pipe.   |nPiping|n takes the output  from the first
  1287. command on the command line,  and sends it as input to the second command
  1288. on the command line.  For example,
  1289.           CHKDSK C:\*.* /V || MORE
  1290. That takes the output  of the CHKDSK command  that would normally be sent
  1291. to your screen at about a million miles per minute,  and sends it instead
  1292. as input to the MORE command.   The MORE command takes its input and div-
  1293. ides it into 23-line sections,  and sends each section to the screen with
  1294. a "-- More --" symbol at the bottom,  which means you should  press a key
  1295. when you're ready to see the next screenful of output.
  1296.  
  1297. Remember,  you can't use pipes with filenames or device|1s,  only commands.
  1298. |nPiping|n sends STDOUT  from one command as STDIN  to another command.   And
  1299. you can't put a command to the right of a > or < symbol.   The only thing
  1300.                      <page down> for more Redirection
  1301. that goes to the right of those symbols is a device or filename.   If you
  1302. typed CHKDSK C:\*.* /V > MORE by accident, that would create a file named
  1303. MORE (with no extension) in the current directory and put |sCHKDSK|s's output
  1304. there instead of sending it to the MORE command.
  1305.  
  1306. Here's another useful example.   Remember how you can use  a command like
  1307. DEL C:\TEMP\*.* < Y.TXT  to make the DEL command work without waiting for
  1308. you to say  whether you're  "sure" or not?   Well that requires  that you
  1309. have a little file named Y.TXT  which contains a Y and a carriage return,
  1310. sitting on your disk  taking up an  entire cluster  of disk space.   This
  1311. command will serve the same purpose, without that Y.TXT file:
  1312.           ECHO Y || DEL C:\TEMP\*.*
  1313. The output of this ECHO command  is a Y and carriage return,  so with the
  1314. pipe,  that gets sent  to the DEL command  whenever DEL gets ready to ask
  1315. for its input.   Now you can get rid of  your Y.TXT file that's taking up
  1316. all that disk space!
  1317.  
  1318. The only problem with piping  is that DOS needs to borrow some disk space
  1319. to create some temporary files, whenever you use piping.  If your current
  1320.                      <page down> for more Redirection
  1321. disk doesn't have enough room,  or if you're  on a network  and you don't
  1322. have write access to the current drive, or if you have a write-protect on
  1323. the current disk, then DOS won't be able to perform the piping operation.
  1324. Also,  if you should use the <Ctrl-C> keystroke  to break out of the com-
  1325. mand,  or if you have a power outage  in the middle of the command,  then
  1326. those little  temp files  will get left  on your disk,  for you to wonder
  1327. later where they came from.
  1328.  
  1329. If you have DOS version 5, you can set an environment variable named |TTEMP|T
  1330. which will tell DOS  where you want those temp files created,  instead of
  1331. in older versions of DOS, the temp files were created in the current dir-
  1332. ectory of the current drive.  No more!  If you have a RAMdisk with E: for
  1333. a drive letter, put this command into your AUTOEXEC.BAT file:
  1334.           SET TEMP=E:\
  1335. Now whenever DOS does any piping,  it will put those temp files  onto the
  1336. RAMdisk.  That's great for two reasons.  First, a RAMdisk is so much fas-
  1337. ter than any other type of disk, so piping operations will be faster than
  1338. they would be  if |nTEMP|n was not set  or if it was set to a slow hard disk.
  1339. Second,  if you have a power failure  in the middle  of the command,  you
  1340.                      <page down> for more Redirection
  1341. won't have to go and erase those little temp files because when the power
  1342. went out, everything on the RAMdisk, including the little temp files, was
  1343. erased automatically.  (See also DOSSHELL for another use for TEMP.)
  1344.  
  1345. Even if you don't  have a RAMdisk,  if you have DOS version 5  you should
  1346. use a  SET |sTEMP|s=C:\SOMEWHERE  command in your AUTOEXEC.BAT file,  so that
  1347. your temp files all end up in the same place,  instead of being scattered
  1348. all over the place  depending on what drive and directory you happened to
  1349. be in at the time you performed  a piping operation.   Of course,  if the
  1350. operation  is completed properly,  DOS will delete  the temp files all by
  1351. itself.
  1352.  
  1353. You can also combine more than one |nredirection|n character in the same com-
  1354. mand.  For example:
  1355.           FIND "Hello" FILE1 || SORT /+3 || MORE
  1356.           CHKDSK C:\*.* /V || FIND "WHAT" > PRN
  1357.           FORMAT A: < FMT.TXT > DISKSIZE.TXT
  1358. But except for the pipe symbol,  you can't use more than one  of the same
  1359. symbol in the same command.  For example,
  1360.                      <page down> for more Redirection
  1361.           DIR > FILE1 > FILE2
  1362. will not send the output of the DIR command to both of those files!
  1363.  
  1364. There is a type of command called a "|tfilter|t",  which takes STDIN from the
  1365. keyboard  and performs some function on it,  and then sends STDOUT to the
  1366. screen.  Filters don't really do anything useful unless they're used with
  1367. some |nredirection|n.   FIND,  MORE,  and SORT are the filters that come with
  1368. DOS,  although the FIND |nfilter|n  is easier to use as a regular command in-
  1369. stead of as a normal |nfilter|n.  That means, use it without the < symbol.
  1370.  
  1371. You can also use |nredirection|n to create an empty file or a non-empty file.
  1372. Remember that as soon as DOS sees the > symbol,  if there's a filename on
  1373. the other side of that symbol  then the specified file gets created,  be-
  1374. fore DOS even looks at the rest of the command.   So if you do not have a
  1375. file named FILE1 and you execute this command:
  1376.          TYPE FILE1 > FILE1
  1377. then DOS creates  a file named FILE1  and so far it's empty,  but it does
  1378. exist.   So then DOS types out the contents  of the FILE1 file (nothing),
  1379. and sends that output  (nothing) to the FILE1 file.   So FILE1 still con-
  1380.                      <page down> for more Redirection
  1381. tains nothing.   You just  created  a zero-length  file  which takes up a
  1382. directory entry, but no disk space gets used because the file is empty.
  1383.  
  1384. You can use the ECHO command to create a non-empty file like this:
  1385.           ECHO HELLO > FILE2
  1386.           ECHO HOW ARE YOU >> FILE2
  1387. DOS creates a file  named FILE2 and the ECHO command  puts the word HELLO
  1388. and a carriage return  into that file.   The next command opens the FILE2
  1389. file again,  and sends the words HOW ARE YOU and another carriage return,
  1390. to the end of the file.
  1391.  
  1392. If you're absolutely positive that the last line  in your CONFIG.SYS file
  1393. ended with a carriage return,  then you can add a new line  to the end of
  1394. it without even editing it.  Like this:
  1395.           ECHO |sDEVIC|1E|s=C:\DOS\ANSI.SYS >> C:\CONFIG.SYS
  1396. But if the last line in the CONFIG.SYS file were |sSTACKS|s=0,0 and that com-
  1397. mand didn't have any carriage return at the end of it, then the result of
  1398. that ECHO command would be this:
  1399.           |sSTACKS|s=0,0|sDEVIC|1E|s=C:\DOS\ANSI.SYS
  1400.                      <page down> for more Redirection
  1401. all on one line like that,  and DOS wouldn't appreciate that command very
  1402. well the next time you reboot the computer  and DOS tries to execute  the
  1403. commands in your CONFIG.SYS file.  That's a good reason to make sure that
  1404. each command in your CONFIG.SYS file, or any batch file, ends with a car-
  1405. riage return (the <Enter> key).   What that means is don't ever type <F6>
  1406. or <Ctrl-Z> before you hit the <Enter> key at the end of a line, when you
  1407. are using COPY CON FILENAME or EDLIN or anything else,  to create or mod-
  1408. ify a file.   Always put the F6 or <Ctrl-Z> on a blank line by itself, at
  1409. the end of your file.
  1410.  
  1411. You can use input |nredirection|n  to make use of  script files  for commands
  1412. such as EDLIN, GWBASIC, and DEBUG.   If you upgraded from DOS version 3.2
  1413. to 3.3,  and wanted to change the first line of each batch file from ECHO
  1414. OFF to  @|sECHO|s OFF,  you could create  a little text file  named |nEDLIN|n.TXT
  1415. like this:
  1416.           1
  1417.           @|sECHO|s OFF
  1418.           E
  1419. and then use this command:
  1420.                      <page down> for more Redirection
  1421.           FOR %a IN (*.BAT) DO EDLIN %a < |nEDLIN|n.TXT
  1422. And automatically, right before your very eyes, all your batch files will
  1423. be updated to include the @ symbol  which didn't appear in DOS until ver-
  1424. sion 3.3.  Here's how it works.  The FOR command causes DOS to repeat the
  1425. command that's written after DO,  for each file that matches the specifi-
  1426. cation in parentheses.   So for each .BAT file  in the current directory,
  1427. DOS will perform the command  EDLIN WHATEVER.BAT < |nEDLIN|n.TXT.   That will
  1428. load the EDLIN line editor and the WHATEVER.BAT file, and then instead of
  1429. taking STDIN from the keyboard,  EDLIN will take its input  from the file
  1430. you created named |nEDLIN|n.TXT,  which contains all the commands EDLIN needs
  1431. to change line one  of the file to  @|sECHO|s OFF,  and then save the changed
  1432. file to disk,  and exit back to DOS.   Then DOS will continue on with the
  1433. FOR command, with the next .BAT file in the current directory, until they
  1434. have all been edited.   From now on,  whenever you run  your batch files,
  1435. you won't see that ugly old "|sECHO|s OFF" command flash onto the screen, be-
  1436. cause what the @ symbol does  is it tells DOS not to display the command.
  1437. That's just about  the best thing about EDLIN,  even though it's a really
  1438. primitive text editor,  is that it will take redirected input from a text
  1439. file script  like that.   There aren't more than  two or three other text
  1440.                      <page down> for more Redirection
  1441. editors in the entire world that can do that.
  1442.  
  1443. Now if you want the script file  to cause EDLIN to insert any lines,  you
  1444. have to remember  that EDLIN requires a <Ctrl-C> keystroke to go from in-
  1445. sert mode back to the command mode.   So the <Ctrl-C> must be part of the
  1446. script file.   It's not easy to get a <Ctrl-C> into a file, but it can be
  1447. done.  With EDLIN itself.  You use the <Ctrl-V> keystroke sequence in ED-
  1448. LIN to tell EDLIN that the next keystroke you enter  should be interpret-
  1449. ed as a control character.   So <Ctrl-V> followed by a capital C will put
  1450. the <Ctrl-C> into the file.  It will look like this:
  1451.           1I
  1452.           ECHO OFF
  1453.           ^VC
  1454.           E
  1455. That script,  if redirected as input into an EDLIN command,  would insert
  1456. the command  ECHO OFF  before the first line of the file you're |sEDLIN|sing.
  1457. (Remember that  ^C or ^V  means the same thing as  <Ctrl-C> or <Ctrl-V>.)
  1458. The next time you look at  or edit that script file,  the V will be miss-
  1459. ing, but that's ok.   It was only there in order to tell EDLIN to put the
  1460.                      <page down> for more Redirection
  1461. ^C into the file, and it served its purpose.   You can't just type <Ctrl-
  1462. C> to get it in the file, because if you type <Ctrl-C> in EDLIN, it swit-
  1463. ches from insert mode to command mode.   EDLIN can't tell you were trying
  1464. to put the ^C into the text rather than trying to switch to command mode.
  1465. So that's why you needed the <Ctrl-V> trick.
  1466.  
  1467. Don't forget that  if you have DOS version 5  and have /P as part of your
  1468. DIRCMD environment variable, then if you should use the command:
  1469.           DIR > FILE1
  1470. to put your  directory listing  into a text file,  DOS will be performing
  1471. the command  DIR /P  because of your DIRCMD setting,  and it will be sit-
  1472. ting there waiting for you to  "Press any key . . ." only you won't real-
  1473. ize it because the "Press any key . . ." message has been redirected into
  1474. the FILE1 file  along with the rest of  STDOUT,  and you'll think  you've
  1475. locked up the computer  when all you need to do is  press any key.   Yep,
  1476. the first time I did that, I stared at the screen for a good five minutes
  1477. wondering why on earth my computer had locked up,  before I realized what
  1478. the problem was.
  1479.  
  1480.                      <page down> for more Redirection
  1481. You can't redirect the input or output of a batch file,  although you can
  1482. use |nredirection|n on each line in a batch file.   For example,  to make all
  1483. output  of a batch file go to  the NUL device instead of  to your screen,
  1484. you might be tempted to try this:
  1485.           |nBATCH|n > NUL
  1486. Nope,  it won't work!   |nBATCH|n.BAT will be executed as usual,  and all the
  1487. STDOUT will go to the screen.   If you want to suppress the output of the
  1488. batch file,  you need to put a > NUL at the end of each line in the batch
  1489. file.  |nRedirection|n on the command line that executes the batch file won't
  1490. work,  even though |nredirection|n will work just fine inside the batch file.
  1491.  
  1492. All DOS commands send their output to either STDOUT or STDERR.  STDERR is
  1493. always the monitor, and STDOUT is the monitor unless |nredirection|n has been
  1494. specified.  But lots of programs that don't come with DOS send their out-
  1495. put straight to video memory,  and for those programs, trying to redirect
  1496. output  from the screen to somewhere else  just won't work!   And lots of
  1497. programs  take their input  straight from  the keyboard  rather than from
  1498. STDIN, so for those programs, input |nredirection|n won't work.  Sorry!
  1499.  
  1500.                      <page down> for more Redirection
  1501. And remember that  when you're using piping,  the command to the right of
  1502. the pipe symbol  is still a plain old  regular DOS command,  so just like
  1503. always,  its executable file must be either in the current directory,  or
  1504. on the PATH,  in order for DOS  to find and execute it.   If you ever get
  1505. "|sBad command or filename|s"  from a  command  like  TYPE CONFIG.SYS || MORE,
  1506. that's because your |nMORE|n.COM file is not anywhere that DOS can find it.
  1507.  
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.                      <page down> for The |nFIND|n Command
  1521.                              The |TFIND|T Command
  1522.  
  1523. This is a highly useful command.   It will search any file for any string
  1524. of text.  Of course it's only likely to work on pure ASCII files, because
  1525. a file created by a word processor  has control codes embedded in it,  to
  1526. tell it  where the margins go  and where the words  should be in italics,
  1527. and things like that.   So the word "little"  with control codes embedded
  1528. in it might look like "littlΣ" so if you use the |nFIND|n command to look for
  1529. "little", it won't be found.  But for ASCII files, the |nFIND|n command works
  1530. wonderfully.
  1531.  
  1532. Well,  here's how you use it.   Suppose you want  to search for  the word
  1533. "little" in the files named FILE1, FILE2, and FILE3:
  1534.           |nFIND|n "little" FILE1 FILE2 FILE3
  1535. will do it.   But it won't find the word  "little" if it's capitalized at
  1536. the beginning of a sentence.  For that you need this command:
  1537.           |nFIND|n "Little" FILE1 FILE2 FILE3
  1538. But in DOS version 5.0, there's a new switch to the |nFIND|n command.  The /I
  1539. switch tells DOS to ignore the case of the letters so that  |nFIND|n "little"
  1540.                         <page down> for more FIND
  1541. will find "little" and "Little" and "LITTLE" and "liTtlE".
  1542.           |nFIND|n /I "little" FILE1 FILE2 FILE3
  1543. would do that if you have DOS version 5.0 or later.
  1544.  
  1545. If you're  using the  |nFIND|n command  as a filter  (explained later in this
  1546. section)  to find a filename in your directory listings,  be sure to type
  1547. the filename in capital letters  (or else use the /I switch,  if you have
  1548. DOS version 5.0)  because filenames  are always  stored  in the directory
  1549. listings in all-caps,  so |nFIND|n won't find the file HITHERE if you tell it
  1550. to search for "ither", but |nFIND|n "ITHER" would work.
  1551.  
  1552. The output of the find command would be like this:
  1553.           ---------- FILE1
  1554.           Mary had a little lamb,
  1555.           ---------- FILE2
  1556.           ---------- FILE3
  1557.           Little Red Riding Hood took a basket of fruit to her sick .....
  1558.           When Little Red Riding Hood got to her grandmother's house,....
  1559. It shows the name of each file  as it begins searching it,  then it shows
  1560.                         <page down> for more FIND
  1561. each line that contains the word being searched for.   If the word is not
  1562. found in a particular file,  it doesn't say anything,  it just goes on to
  1563. search the next file.
  1564.  
  1565. If you're searching  more than one file  at a time,  you have to type out
  1566. each filename separately.  Wildcards can't be used with the |nFIND|n command.
  1567. Of course you could get around that by using the FOR command, as in:
  1568.           FOR %a IN (FILE*) DO |nFIND|n /I "little" %a
  1569.  
  1570. Remember that the |nFIND|n command  will search for exactly  what you tell it
  1571. to search for, no more, and no less.   If you tell it to search for "and"
  1572. it will find "and"  "hand"  "land" and "grandmother".   If you tell it to
  1573. search for " and " that would make it leave out "hand" and "land" and all
  1574. that,  but it will also  leave out "and,"  because there is a comma after
  1575. "and" instead of a <Space>.   If you're searching for  the word "renamed"
  1576. and the word  does exist in the file  but it's hyphenated at the end of a
  1577. line,  so that it exists  in the file  in the form  "re-" on one line and
  1578. "named" on the next line, then |nFIND|n won't find it at all.  The same thing
  1579. if you're searching for a string that is more than one word long, such as
  1580.                         <page down> for more FIND
  1581. "my birthday".   If  "my" is at the end of one line and  "birthday" is at
  1582. the beginning of  the next line,  then |nFIND|n won't find  "my birthday" be-
  1583. cause there's a carriage return instead of a <Space> between those words.
  1584.  
  1585. If the string  you want to search for  contains any quotation marks,  you
  1586. have to type two quotation marks  for each one in the string.   For exam-
  1587. ple,  to find  the string  <He said, "Why don't we go to the mall?">  you
  1588. have to use this command:
  1589.           |nFIND|n "He said, ""Why don't we go to the mall?"""
  1590. Each quotation mark  in the string you're looking for  is replaced by two
  1591. quotation marks,  and then the entire string is also enclosed in one more
  1592. set of quotation marks as usual.
  1593.  
  1594. If the file you're searching has a  <Ctrl-Z>  (End-of-File marker) in it,
  1595. the |nFIND|n command won't search any of the text past that point.
  1596.  
  1597. The |nFIND|n command has other switches  that change its output a little bit,
  1598. and these switches are for all DOS versions, not just 5.0.
  1599.  
  1600.                         <page down> for more FIND
  1601. The /V switch  tells DOS to find  all the lines  in the file  that do not
  1602. contain the string  you're searching for.   Just the opposite  of normal.
  1603. Suppose you want to use  |nFIND|n as a filter  (described below)  to find all
  1604. the files in the current directory that were not updated today.
  1605.           DIR || |nFIND|n /V "6-27-91"
  1606. would do it.
  1607.  
  1608. The /C switch  tells DOS to just  count the number  of lines that contain
  1609. the search string.   It won't display the lines, it will only count them.
  1610. For example,  if you want to know how many lines  are in the entire file,
  1611.           |nFIND|n /C /V "%$#@!" FILENAME.EXT
  1612. would do it, because the /V tells |nFIND|n to look for lines that do not con-
  1613. tain the string %$#@!  and that's going to be all of them,  right?   Then
  1614. the /C switch  will count how many lines  matched the search,  and that's
  1615. the total number of lines in the file.
  1616.  
  1617. The /N switch tells |nFIND|n to display line numbers with each line.   So the
  1618. output in this case will be the line that contains the search string, and
  1619. the line number for that line,  for each line  that contains  the string.
  1620.                         <page down> for more FIND
  1621. It might look like this:
  1622.           [2]Little Red Riding Hood took a basket of fruit to her .......
  1623.           [16]When Little Red Riding Hood got to her grandmother's ......
  1624.  
  1625. Well that's all there is  to the |nFIND|n command in its normal command form,
  1626. but that's definitely not the only way to use it.  It can also be used as
  1627. a filter.   (Go read the section on redirection and then come back here.)
  1628.  
  1629. A filter is a little command that takes STanDard INput from the keyboard,
  1630. performs some function  on that input,  and then sends STanDard OUTput to
  1631. the monitor.   The three |sfilter|ss that come with DOS are |nFIND|n,  MORE,  and
  1632. SORT.
  1633.  
  1634. When you don't supply  a filename on the |nFIND|n  command line,  then you're
  1635. using it  as a filter.   Well it doesn't do much good  to take input from
  1636. the keyboard and send output to the screen.   That's why I told you to go
  1637. read about redirection first.   If you redirect the input  from somewhere
  1638. else,  and/or  redirect output to  somewhere else,  then a filter is very
  1639. useful.
  1640.                         <page down> for more FIND
  1641.           |nFIND|n "string" < FILE1 > FILE2
  1642. will create a file named FILE2  that contains only those lines from FILE1
  1643. that contain "string".
  1644.           TYPE FILE1 || |nFIND|n "string" || |nFIND|n /V "smaller string" > PRN
  1645. will print a list of all the lines in FILE1  that contain "string" but do
  1646. not contain "smaller string".
  1647.           DIR || |nFIND|n "AB"
  1648. will show you all the lines  in your directory that contain the string AB
  1649. in either the filename or the extension.
  1650.           DIR || |nFIND|n /V "<DIR>"
  1651. will show you  all the lines in your directory  that are not subdirectory
  1652. listings.
  1653.           DIR || |nFIND|n /V "e"
  1654. will show you a directory listing  without the lines that say  "|sVolume|s in
  1655. drive C is..." and "... bytes free".
  1656.  
  1657. (Of course, if you have DOS version 5.0,  you can get those last two dis-
  1658. plays  by using  the new switches  to the  DIR command  instead of  using
  1659. |nFIND|n.)
  1660.                      <page down> for The |nMORE|n Command
  1661.                              The |TMORE|T Command
  1662.  
  1663. This command  takes its input  from the keyboard and  sends its output to
  1664. the monitor, one screenful (23 lines) at a time.  What good does that do?
  1665. Not a whole lot.  But wait, this is a very useful command after all.  Be-
  1666. cause you can  use it with input redirection,  to make it  take its input
  1667. from a file instead.  Have you ever used the TYPE command on a large file
  1668. and watched it  scroll by on your screen about ten  thousand times faster
  1669. than you could read it?   TYPE FILENAME || |nMORE|n or  |nMORE|n < FILENAME  would
  1670. make the file go to your screen just one screenful at a time,  and at the
  1671. end  of each page it would say "-- More --" and that tells you to hit any
  1672. key to make it continue.   When you hit a key,  it will show you one more
  1673. screenful, etc.
  1674.  
  1675. Be very  careful to make sure  you understand  the concept of redirection
  1676. before you go using the second method above, with the < symbol.   Because
  1677. if you accidentally use the > symbol instead,  every byte of data in that
  1678. FILENAME file will be erased.  Permanently.  It won't be recoverable with
  1679. the UNDELETE command or anything else.   The first method above, with the
  1680.                         <page down> for more MORE
  1681. || symbol, is much safer although it does have its drawbacks.
  1682.  
  1683. The drawbacks of the || method are that it takes more keystrokes,  because
  1684. you have to use the TYPE command,  and that any time you use the || symbol
  1685. you create two temporary files on the current disk.  If the current drive
  1686. is a floppy,  that temp file  is going to slow you down.   If the disk in
  1687. the current drive is |swrite-protect|sed, you won't be able to use the || sym-
  1688. bol at all.   And if you use <Ctrl-C> to BREAK out of the operation after
  1689. you hit the <Enter> key, the temp files will be left laying around on the
  1690. disk.   (Of course if you have version 5.0 or later,  then the temp files
  1691. used by the operation  of the || symbol will be created in  whatever drive
  1692. and directory is pointed to by the TEMP environment variable,  and it ap-
  1693. pears that breaking out with  <Ctrl-C> no longer leaves the files sitting
  1694. there, so none of this is a problem.)  But despite these drawbacks of the
  1695. || method, it's still worth it to use until you're absolutely sure you un-
  1696. derstand the difference  between > and <,  for the safety of the file you
  1697. want to display.
  1698.  
  1699. You can also use  this command to send the output of  some other  command
  1700.                         <page down> for more MORE
  1701. through it.   For example,  CHKDSK *.* /V || |nMORE|n, so that you can see the
  1702. CHKDSK report before it all scrolls off the screen.   Just about any time
  1703. your screen tries to show you something faster that you can read it,  the
  1704. |nMORE|n command will let you slow it down.   (Except for while your AUTOEXEC
  1705. .BAT and CONFIG.SYS files are executing.  For that, all you can do is use
  1706. your <Pause> key,  which isn't all that good of an idea during |sboot|sup, or
  1707. put PAUSE as the first command in AUTOEXEC.BAT and put another PAUSE com-
  1708. mand every two or three lines, save this edited AUTOEXEC.BAT file, reboot
  1709. and you'll be able  to see all those messages that normally fly by.   Now
  1710. edit the file  again to remove those PAUSE commands,  and you're  back to
  1711. normal.)
  1712.  
  1713. If any of this is confusing you,  check out the section on redirection to
  1714. learn about the <, ||, and > symbols and what they do.
  1715.  
  1716.  
  1717.  
  1718.  
  1719.  
  1720.                      <page down> for The |nSORT|n Command
  1721.                              The |TSORT|T Command
  1722.  
  1723. This command sorts ASCII files into ASCII order.   That's pretty close to
  1724. alphabetical order,  except that lowercase letters  come after of all the
  1725. uppercase ones (...XYZabc...).   But they corrected that problem starting
  1726. with DOS version 3,  so now |nSORT|n really does  sort in alphabetical order.
  1727.  
  1728. Actually, |nSORT|n is a filter, so it takes standard input and sends standard
  1729. output.  If you just use |nSORT|n with no Input/Output redirection, your cur-
  1730. sor will just  drop down a line  and wait for you  to enter some lines of
  1731. text for it to sort.  You type the stuff and then hit <F6> or <Ctrl-Z> to
  1732. tell DOS you're done,  hit <Enter>,  and |nSORT|n will sort the text you just
  1733. typed,  by the first character  in each line,  and send the output to the
  1734. screen.   If the first character is the same in two different lines, then
  1735. |nSORT|n will sort those two lines  by their second character.   If those two
  1736. characters are the same too, then the third character will be used as the
  1737. tie-breaker, etc.
  1738.  
  1739. But you can use the |nSORT|n filter  with input redirection,  output redirec-
  1740.                         <page down> for more SORT
  1741. tion, piping,  or any combination of those, to make it do just about any-
  1742. thing you want.
  1743.  
  1744. Here's the syntax for this command:
  1745.           |nSORT|n /R /+# < D:\DIR\FILE1.EXT > D:\DIR\FILE2.EXT
  1746. where /R makes it sort in reverse order, /+# makes it sort by the # char-
  1747. acter instead of  by the first character  of each line,  and FILE1.EXT is
  1748. the file you want it to sort.   Just make sure  that you use < and not >,
  1749. to make the file point  toward the command.   Because if you accidentally
  1750. use > instead,  for that part of the command, then the file you wanted to
  1751. sort gets erased instead.  Now if you want the output of the |nSORT|n command
  1752. to go, instead of to the screen, somewhere else like to the printer or to
  1753. a different file,  then you use the > symbol with PRN for the printer, or
  1754. with a filename  as in the example above.   Make sure  that you don't use
  1755. the same filename for the > symbol as you used for the < symbol,  because
  1756. once again,  that would erase the contents  of that file before it gets a
  1757. chance to get sorted.   And if you want to keep the FILE2 file instead of
  1758. the FILE1 file,  then you can delete the  FILE1 file after the command is
  1759. done,  but first look at it to make sure that the |nSORT|n was successful and
  1760.                         <page down> for more SORT
  1761. didn't lose any of the data in the file.   Then use the RENAME command to
  1762. give the target file the same name as what the source file had before you
  1763. deleted it.  That is, if you want it to have the same old name.
  1764.  
  1765. You can also use  |nSORT|n as the target  of a piping operation.   That means
  1766. you can sort  the output of another command  before displaying it  on the
  1767. screen.   For example, DIR || |nSORT|n /+14  would cause a DIR command to send
  1768. its output to the  |nSORT|n command instead of to the screen,  and |nSORT|n would
  1769. sort the directory listing  by the data in the fourteenth column which is
  1770. the file size, and then that sorted output would go to your screen.
  1771.  
  1772. The trouble with that  is that the lines of the DIR command's output that
  1773. say things like  "|sVolume|s in drive C is WHATEVER" and  "However many bytes
  1774. free" would be included in that sorted output.  Yuk.   To get rid of that
  1775. problem, use the FIND filter to get rid of those lines.   Every line that
  1776. has to do with files and directories has a - character in it, in the date
  1777. column.   So  DIR || FIND "-" || |nSORT|n /+14 || MORE  would  take a  directory
  1778. listing, remove the lines that don't contain -,  sort the remaining lines
  1779. according to column 14,  and display the output 23 lines at a time so you
  1780.                         <page down> for more SORT
  1781. can see it  before it scrolls off the screen.   Notice that it would work
  1782. just as well to say  DIR || |nSORT|n /+14 || FIND "-" || MORE  but it would take
  1783. longer,  because there would be  more lines for |nSORT|n to sort.   Using the
  1784. FIND command first to filter out the lines  you're not going to want any-
  1785. way,  means there are fewer lines  for |nSORT|n to deal with.   Since |nSORT|n is
  1786. pretty slow,  as far as computer programs go,  you want to use FIND first
  1787. if that will serve the purpose, whenever you're using both |sfilter|ss in the
  1788. same command.
  1789.  
  1790. The first column in a directory listing is, of course, the filename.  The
  1791. extension starts in column 10, the size in column 14,  the date in column
  1792. 24, and the time in column 34.  Of course, if you have DOS version 5, you
  1793. don't need the |nSORT|n command  to sort your DIR listings,  but it's still a
  1794. useful command, for sure!
  1795.  
  1796. A few caveats:  |nSORT|n can't handle files larger than 63 kilo|sbytes|s in size.
  1797. Each line  in the file  must have a  carriage return (the <Enter> key) at
  1798. the end of it.
  1799.  
  1800.                         <page down> for more SORT
  1801. If you're using  output redirection  to create a new file  containing the
  1802. sorted version of the input file,  and if there is a ^Z End-of-File char-
  1803. acter at the end of the file,  it will be moved to the beginning since it
  1804. has  a lower ASCII  code number  than any letters,  and with a  ^Z as the
  1805. first character  of the new sorted file,  you won't be  able to TYPE  the
  1806. file to the screen, or PRINT it, or do hardly anything with it!   (That's
  1807. one reason why I said to make sure the |nSORT|n was successful before you de-
  1808. lete the  original file,  if the sorted one  is the only one  you plan to
  1809. keep.)   Make sure your file does not have a ^Z in it  before you use the
  1810. |nSORT|n command  on it.   You can use  the COPY command  with the /A  and /B
  1811. switches to remove a ^Z from a file.  For example COPY /A FILEB4 FILEAFTR
  1812. /B, then RENAME FILEAFTR FILEB4 to give it back its old name.   Of course
  1813. if FILEB4 has a ^Z in it  before the end  of the file,  all the data that
  1814. came after it  will be lost.   Don't do this  unless the first  ^Z in the
  1815. file comes at the very end of the file.  Or else do it on a spare copy of
  1816. the file first and check the results before you do it on the real copy.
  1817.  
  1818.  
  1819.  
  1820.                    For beginning of File 3, see Memory
  1821. |tAUTOEXEC.BAT|t|fSIMPLY1|f
  1822. |TSETVER|T|fSIMPLY1|f
  1823. |tUNDELETE|t|fSIMPLY1|f
  1824. |tUNFORMAT|t|fSIMPLY1|f
  1825. |tXCOPY|t|fSIMPLY1|f
  1826. |tBytes|t|fSIMPLY3|f
  1827. |tMemory|t|fSIMPLY3|f
  1828. |TMEM|T|fSIMPLY3|f
  1829. |TPRINT|T|fSIMPLY3|f
  1830. |tRAMdisk|t|fSIMPLY3|f
  1831. |TREPLACE|T|fSIMPLY3|f
  1832. |TRESTORE|T|fSIMPLY3|f
  1833. |TTREE|T|fSIMPLY3|f
  1834. |tANSI.SYS|t|fSIMPLY4|f
  1835. |TBREAK|T|fSIMPLY4|f
  1836. |tCONFIG.SYS|t|fSIMPLY4|f
  1837. |TDEVIC|1E|T|fSIMPLY4|f
  1838. |tEnvironment|t|fSIMPLY4|f
  1839. |tfloppy|t|fSIMPLY4|f
  1840. |TFORMAT|T|fSIMPLY4|f
  1841. |tmacros|t|fSIMPLY4|f
  1842. |tPATH|t|fSIMPLY4|f
  1843. |tPROMPT|t|fSIMPLY4|f
  1844. |TSET|T|fSIMPLY4|f
  1845. |TSTACKS|T|fSIMPLY4|f
  1846. |tvolume|t|fSIMPLY4|f
  1847. |tBad command or filename|t|fSIMPLY5|f
  1848. |TC|1:|T|fSIMPLY5|f
  1849. |TCD|T|fSIMPLY5|f
  1850. |tCOMMAND.COM|t|fSIMPLY5|f
  1851. |TCOMMAN|1D|T|fSIMPLY5|f
  1852. |TCON|T|fSIMPLY5|f
  1853. |TCOPY|T|fSIMPLY5|f
  1854. |TCTTY|T|fSIMPLY5|f
  1855. |tcurrent|t|fSIMPLY5|f
  1856. |TDATE|T|fSIMPLY5|f
  1857. |tdefault|t|fSIMPLY5|f
  1858. |TDEL|T|fSIMPLY5|f
  1859. |tDevice|1s|t|fSIMPLY5|f
  1860. |TDIRCMD|T|fSIMPLY5|f
  1861. |tDirectory|t|fSIMPLY5|f
  1862. |TDIR|T|fSIMPLY5|f
  1863. |tExecutable|t|fSIMPLY5|f
  1864. |texternal|t|fSIMPLY5|f
  1865. |TGRAFTABL|T|fSIMPLY5|f
  1866. |tinternal|t|fSIMPLY5|f
  1867. |TKEYB|T|fSIMPLY5|f
  1868. |TNUL|T|fSIMPLY5|f
  1869. |TPRN|T|fSIMPLY5|f
  1870. |TRENAME|T|fSIMPLY5|f
  1871. |troot|t|fSIMPLY5|f
  1872. |TTIME|T|fSIMPLY5|f
  1873. |TTYPE|T|fSIMPLY5|f
  1874. |TVER|T|fSIMPLY5|f
  1875. |t*.*|t|fSIMPLY6|f
  1876. |tASCII|t|fSIMPLY6|f
  1877. |TBBS|T|fSIMPLY6|f
  1878. |tBoot|t|fSIMPLY6|f
  1879. |tcluster|t|fSIMPLY6|f
  1880. |tDisks|t|fSIMPLY6|f
  1881. |tdownloading|t|fSIMPLY6|f
  1882. |tKeyboard|t|fSIMPLY6|f
  1883. |tParameters|t|fSIMPLY6|f
  1884. |tPower|t|fSIMPLY6|f
  1885. |tpublic domain|t|fSIMPLY6|f
  1886. |tReboot|t|fSIMPLY6|f
  1887. |tReplaceable|t|fSIMPLY6|f
  1888. |tShareware|t|fSIMPLY6|f
  1889. |tWildcards|t|fSIMPLY6|f
  1890. |tWrite-protect|t|fSIMPLY6|f
  1891. |TBACKUP|T|fSIMPLY7|f
  1892. |TCHKDSK|T|fSIMPLY7|f
  1893. |TCOMP|T|fSIMPLY7|f
  1894. |TDEBUG|T|fSIMPLY7|f
  1895. |TDISKCOMP|T|fSIMPLY7|f
  1896. |TDISKCOPY|T|fSIMPLY7|f
  1897. |TDOSKEY|T|fSIMPLY7|f
  1898. |TDOSSHELL|T|fSIMPLY7|f
  1899. |TEDIT|T|fSIMPLY7|f
  1900. |TEDLIN|T|fSIMPLY7|f
  1901. |TGWBASIC|T|fSIMPLY7|f
  1902.