MS-DOS 2.0 Utility Extensions The following notation is used below: [item] item is optional. item* item is repeated 0 or more times. item+ item is repeated 1 or more times. {item1 | item2} item1 is present or item 2 is present but not both. <object> indicates a syntactic variable. COMMAND invokation COMMAND [[<drive>:]<path>] [<cttydev>] [-D] [-P] [-C <string>] -P If present COMMAND will be permanent, otherwise this is a transient command. -D If present COMMAND will not prompt for DATE and TIME when it comes up. d: Specifies device where command will look for COMMAND.COM current default drive if absent. <Path> Specifies a directory on device d: root directory if absent. <cttydev> Name of the CTTY device. /DEV/CON if absent and command is permanent. The /DEV/ may be left off if AVAILDEV is TRUE (see sysinit doc). -C <string> If present -C must be the last switch. This causes COMMAND to try to execute the string as if the user had typed it at the standard input. COMMAND executes this single command string and then exits. If the -P switch is present it is ignored (can't have a single command, permanent COMMAND). NOTE: ALL of the text on the command line after the -C is just passed on. It is not processed for more arguments, this is why -C must be last. COMMAND extensions IF <condition> <command> where <condition> is one of the following: ERRORLEVEL <number> true if and only if the previous program EXECed by COMMAND had an exit code of <number> or higher. <string1> == <string2> true if and only if <string1> and <string2> are identical after parameter substitution. Strings may not have embedded delimiters. EXIST <filename> true if and only if <filename> exists. NOT <condition> true if and only if <condition> is false. The IF statement allows conditional execution of commands. When the <condition> is true, then the <command> is executed otherwise, the <command> is skipped. Examples: IF not exist /tmp/foo ECHO Can't find file /tmp/foo IF $1x == x ECHO Need at least one parameter IF NOT ERRORLEVEL 3 LINK $1,,; FOR %%<c> IN <set> DO <command> <c> can be any character but 0,1,2,3,..,9 (so there is no confusion with the %0 - %9 batch parameters). <set> is ( <item>* ) The %%<c> variable is sequentially set to each member of <set> and then <command> is evaluated. If a member of <set> is an expression involving * and/or ?, then the variable is set to each matching pattern from disk. In this case only one such <item> may be in the set, any <item>s after the first are ignored. Example: FOR %%f IN ( *.ASM ) DO MASM %%f; for %%f in (FOO BAR BLECH) do REM %%f to you NOTE: The '%%' is needed so that after Batch parameter (%0 - %9) processing is done, there is one '%' left. If only '%f' were there, the batch parameter processor would see the '%' then look at 'f', decide that '%f' was an error (bad parameter reference) and throw out the '%f' so that FOR would never see it. If the FOR is NOT in a batch file, then only ONE '%' should be used. SHIFT Currently, command files are limited to handling 10 parameters: %0 through %9. To allow access to more than these, the command SHIFT will perform a 'pop' of the command line parameters: if %0 = "foo" %1 = "bar" %2 = "blech" %3...%9 are empty then a SHIFT will result in the following: %0 = "bar" %1 = "blech" %2...%9 are empty If there are more than 10 parameters given on a command line, then the those that appear after the 10th (%9) will be shifted one at a time into %9 by successive shifts. :<label> This is essentially a no-op. It defines a label in the batch file for a subsequent GOTO. It may also be used to put comment lines in batch files since all lines that start with ':' are ignored. GOTO <label> Causes commands to be taken from the batch file beginning with the line after the <label> definition. If no label has been defined, the current batch file will terminate. Example: :foo REM looping... GOTO foo will produce a infinite sequence of messages: 'REM looping...' NOTE: Labels are case insensitive, :FOO == :foo == :Foo ECHO [{ON | OFF | <message>}] Normally, commands in a BATCH file are echoed onto the standard output as they are seen by COMMAND. ECHO OFF turns off this feature. ECHO ON turns echoing back on. If ON or OFF is not specified and there is text following the command, that text (a message) is echoed to standard output. If there are no arguments at all, the current setting of echo (on or off) is echoed to the standard output in the form: ECHO is xxx Where xxx is "on" or "off". Redirection of standard input/standard output. Programs that read from the keyboard and write to the screen are said to be doing I/O to the standard input and standard output. Using any of the following will result in I/O to these standard devices: Writing to default handles 1 / read from default handle 0. Doing byte I/O using system calls 1, 2, 6-12. These standard devices may be redirected to/from files by the following in command line arguments: > <filename> causes <filename> to be created (or truncated to zero length) and then assigns standard output to that file. All output from the command will be placed in the file. < <filename> causes standard input to be assigned to <filename>. All input to the command will come from this file. If end-of-file is reached, then system calls 1, 2, 6-12 will return ^Z , while reading from handle 0 will return zero characters. >> <filename> causes <filename> to be opened (created if necessary) and positions the write pointer at the end of the file so that all output will be appended to the file. Note that the above will not appear in the command line that the program being invoked sees. Examples: DIR *.ASM > FOO.LST Sends the output of the dir command to the file FOO.LST. FOR %0 IN (*.ASM) DO MASM %0; >>ERRS.LST Sends all error output from assembling every .ASM file into the file ERRS.LST. Piping of standard I/O It is often useful for the output of one program to be sent as input to another program. A typical case is a program that produces columnar output that must later be sorted. The pipe feature allows this to occur naturally is the programs do all of their I/O to the standard devices. For example, if we had a program SORT that read all of it's standard input, sorted it and then wrote it to the standard output, then we could get a sorted directory listing as follows: DIR | SORT The | would cause all standard output generated by the left-hand command to be sent to the standard input of the right-hand command. If we wanted the sorted directory to be sent to a file, we type: DIR | SORT >FILE and away it goes. The piping feature is implemented as sequential execution of the procedures with redirection to and from temporary files. In the example above, the following would be an exact equivalent: DIR >/tmp/std1 SORT </tmp/std1 >FILE The pipe is not a real pipe but rather a quasi-pipe that uses temporary files to hold the input and output as it sequentially executes the elements of the pipe. These files are created in the current directory, of the current drive and have the form %PIPEx%.$$$, where x will be 1 or 2. This means that any program that runs in the pipe must be sure to restore the current directory and drive if it has changed them, otherwise the pipe files will be lost. VER Prints DOS version number. VOL [<drive>:] Prints the volume ID of the disk in drive d:. No d: does default drive. CHDIR [{<drive>: | <path>}] Change directory, or print current. directory.If no argument is given, the current directory on the default drive is printed. If d: alone is given, the durrent directory of drive d is printed. Otherwise the current directory is set to path. NOTE:"CD" is accepted as an abbreviation. MKDIR <path> - Make a directory. "MD" is accepted as an abbreviation. RMDIR <path> - Remove a directory. "RD" is accepted as an abbreviation. The directory must be empty except for '.' and '..'. <path> - A standard XENIX style path with the optional addition of a drive spec: A:/FOO/BAR Full path /FOO/BAR Full path, current drive FOO/BAR Current dir relative A:FOO/BAR " " " VERIFY [{ON | OFF}] Select/deselect verify after write mode. This supliments the V switch to the COPY command. Once turned ON, it stays on until some program changes it (via the set verify system call) or the VERIFY OFF command is given. If no argument is given, the current setting of VERIFY is printed to the standard output in the form: VERIFY is xxx Where xxx is "on" or "off". PATH [<path>{;<path>}*] Set command search paths. This allows users to set directories that should be searched for external commands after a search of the current directory is made. The default value is /bin. In addition there are two special cases: PATH all by itself with no arguments will print the current path. Path with the single argument ';' (ie. "PATH ;") will set the NUL path (no directories other than the current one searched). If no argument is given, the current value of PATH is printed to the standard output in the form: PATH=text of path or No path NOTE: On IBM systems, the default value of path is No path. EXIT For COMMANDs run without the P switch, this causes COMMAND to return. For a normal COMMAND it causes a return to itself. BREAK [{ON | OFF}] Like in CONFIG.SYS, "BREAK ON" turns on the Control C check in the DOS function dispatcher. "BREAK OFF" turns it off. If no argument is given the setting of BREAK is printed to the standard output in the form: BREAK is xxx Where xxx is "on" or "off". PROMPT [<prompt-text>] Set the system prompt. MS-DOS prompts are now user settable, all of the text on the command line is taken to be the new prompt. If no text is present the prompt is set to the default prompt. There are meta strings for various special prompts. These are of the form '$c' where c is one of the following: $ - The '$' character. t - The time. d - The date. p - The current directory of the default drive. v - The version number. n - The default drive. g - The '>' character. l - The '<' character. b - The '|' character. s - The ' ' character. e - The ESC character. _ - A CR LF sequence. EXAMPLE: PROMPT $n: Would set the normal MS-DOS prompt. PROMPT $n> Would det the normal PC-DOS prompt. PROMPT Time = $t$_Date = $d Would set a two line prompt which printed Time = (current time) Date = (current date) NOTE: For '$c' sequences, lower case = upper case, and any character not on the above list is mapped to nothing. SET (ENVNAME)=(ENVTEXT) Set environment strings. This command inserts strings in COMMAND's environment. For instance: SET PROMPT=$n> Duplicates the function of the PROMPT command. SET PATH=p1;p2 Duplicates the function of the PATH command. SET foo=bar Puts the string FOO=bar into the environment (note the case mapping of (ENVNAME)). NOTE: Environments are very flexible, almost anything can be put into the environment with the SET command; the only requirement is that a single '=' be present in the string. CLS Clear screen, causes the ANSI escape sequence ESC[2J to be sent to standard output. CTTY /DEV/dev - Change console TTY. For instance: CTTY /DEV/AUX Would move all command I/O to the AUX port. CTTY /DEV/CON Would move it back to the normal device. The /dev/ prefix may be left off if AVAILDEV is TRUE (see configuration-file doc). COMMAND internal commands take path arguments. DIR <path> COPY <path> <path> DEL(ERASE) <path> If the path is a dir, all files in that dir are deleted. NOTE: The "Are you sure (Y/N)" prompt for DEL and ERASE now uses buffered standard input, so users must type a return after their answer. This gives them the chance to correct if they type 'y' by mistake. TYPE <path> (must specify a file) FILCOM - compare two files The FILCOM program compares two files and produces a log of differences between them. The comparison may be made in two fashions; either on a line-by-line basis, or on a byte-by-byte basis. The line-by-line compare will isolate blocks of lines that are different between the two files and will print the blocks from each file. The line-by-line compare is the default when neither of the two files being compared has the extension .EXE, .COM, or .OBJ. The byte-by-byte compare will display exactly which bytes are different between the two files. If either file being compared has extension .EXE, .COM, or .OBJ then the files will be compared in byte-by-byte mode. RECOVER - recover files from a trashed disk. If a sector on a disk goes bad, you can recover either the file that contained that sector (without the sector) or the entire disk (if the bad sector was in the directory). To recover a particular file: RECOVER <file-to-recover> This will cause the file to be read sector by sector and to be have the bad sector skipped. Note that this implies that the allocation unit containing the bad sector will be read as much as possible. When such a bad sector is found, its containing allocation unit is marked as bad, thus preventing future allocations of that bad sector. To recover a particular disk: RECOVER <drive-letter>: This will cause a scan to be made of the drive's FAT for chains of allocation units (files). A new root directory is then written that has entries of the form FILEnnnn. Each FILEnnnn will point to the head of one of the allocation unit chains. If there are more chains than directory entries in the root, RECOVER prints a message and leaves the un-RECOVERED chains in the FAT so that RECOVER can be run again once some room has been made in the ROOT. DEBUG ON MS-DOS 2.0 When 2.0 DEBUG is invoked it sets up a program header atoffset 0 in its program work area. On previous versions it was OK to overwrite this header with impunity: this is true of the default header set up if no <filespec> is given to DEBUG. If DEBUGging a .COM or .EXE file, however, you must be careful not to tamper with the header of the program below address 5CH, to do this will probably result in a crash. It is also important that an attempt is not made to "restart" a program once the "program terminated normally" message is given. The program must be reloaded with the N and L commands in order for it to run properly. NEW FEATURES The A (Assemble) Command FORMAT: A [<address>] PURPOSE: To assemble 8086/8087/8088 mnemonics directly into memory. o If a syntax error is encountered, DEBUG responds with ^ Error and redisplays the current assembly address. o All numeric values are hexadecimal and may be entered as 1-4 characters. o Prefix mnemonics must be entered in front of the opcode to which they refer. They may also be entered on a separate line. o The segment override mnemonics are CS:, DS:, ES:, and SS: o String manipulation mnemonics must explictly state the string size. For example, the MOVSW must be used to move word strings and MOVSB must be used to move byte strings. o The mnemonic for the far return is RETF. o The assembler will automatically assemble short, near or far jumps and calls depending on byte displacement to the destination address. These may be overridden with the NEAR or FAR prefix. For example: 0100:0500 JMP 502 ; a 2 byte short jump 0100:0502 JMP NEAR 505 ; a 3 byte near jump 0100:0505 JMP FAR 50A ; a 5 byte far jump The NEAR prefix may be abbreviated to NE but the FAR prefix cannot be abbreviated. o DEBUG cannot tell whether some operands refer to a word memory location or a byte memroy location. In this case the data type must be explicity stated with the prefix "WORD PTR" or "BYTE PTR". DEBUG will also except the abbreviations "WO" and "BY". For example: NEG BYTE PTR [128] DEC WO [SI] o DEBUG also cannot tell whether an operand refers to a memory location or to an immediate operand. DEBUG uses the common convention that operands enclosed in square brackets refer to memory. For example: MOV AX,21 ;Load AX with 21H MOV AX,[21] ;Load AX with the contents ;of memory location 21H o Two popular pseudo-instructions have also been included. The DB opcode will assemble byte values directly into memory. The DW opcode will assemble word values directly into memory. For example: DB 1,2,3,4,"THIS IS AN EXAMPLE" DB 'THIS IS A QUOTE: "' DB "THIS IS A QUOTE: '" DW 1000,2000,3000,"BACH" o All forms of the register indirect commands are supported. For example: ADD BX,34[BP+2].[SI-1] POP [BP+DI] PUSH [SI] o All opcode synonyms are supported, For example: LOOPZ 100 LOOPE 100 JA 200 JNBE 200 o For 8087 opcodes the WAIT or FWAIT prefix must be explictly specified. For example: FWAIT FADD ST,ST(3) ; This lines will assemble ; a FWAIT prefix FLD TBYTE PTR [BX] ; This line will not FORMAT enhancements FORMAT will now install volume id's during the format process. DIR and CHKDSK will display these volume id's. User programs can read the volume id on a particular drive by doing a 'search next' with the volume id attribute. It is impossible, using normal DOS calls, to delete a volume id or to create another one. The only way to create a volume id is to reformat the disk. NOTE: On IBM systems the V switch must be given to FORMAT to have it do Volume IDs. CHKDSK FOR MS-DOS 2.0 MS-DOS 2.0 has a tree structured directory scheme which did not exist on previous versions of MS-DOS. As a result CHKDSK is a much more complex program than in previous versions since it must perform a tree traversal to find all of the files on a given disk. It employes a depth first traversal in order to accomplish this. Previous versions of CHKDSK automatically "fixed" disks (regardless of whether it was appropriate). CHKDSK 2.00 run normally will not alter the disk in any way, it simply reports on any inconsistencies found. To actually "fix" a disk CHKDSK must be run with the F switch (Fix). This allows you to perhaps take some alternate (to CHKDSK repairs) action before letting CHKDSK loose on your disk. CHKDSK 2.00 will report on non-contiguous allocation units (extents) for specified files. This is handy for gaging how "fragmented" a disk volume has become. This is done by simply giving a filespec: CHKDSK B:*.* This would report extents for all files in the current directory for drive B after doing a normal consistency check on drive B. Files which have many extents can be copied and renamed to restore them to a contiguous state, thus improving I/O performance to the files. Previous versions of CHKDSK would simply free allocation units which were marked as used, but were not actually part of any file. CHKDSK 2.00 will recover these "orphan" allocation units if specified. If orphan allocation units are found, CHKDSK prompts for free or recover. Free just frees the orphans as previous versions did, recover will employ allocation chain analysis to create "orphan files" in the root directory of the disk. These files will have the form "%ORPHAN%.l$$" where l will take on some ASCII value greater than '@'. These files may then be inspected to see if valuable data was contained in them. If there is not enough room to make all of the "orphan" files, CHKDSK leaves the unrecovered chains in the FAT so that CHKDSK can be run again (once some entries in the ROOT have been deleted). NOTE: Making ORPHAN files is a SLOW process. Verbose mode. CHKDSK 2.00 may be run with the V switch which causes a trace of the files and directories being processed to be printed as CHKDSK runs. FILTERS FOR MS-DOS 2.0 A filter is a utility that reads from standard input, modifies the information in some way, then writes the result to standard output. In this way the data is said to have been "filtered" by the program. Since different filters can be piped together in many different ways a few filters can take the place of a large number of specific purpose programs. The following describes the filters that are provided with MS-DOS 2.0: CIPHER <key word> Cipher reads a program from standard input, encrypts it using the key word provided by the user, then writes the result to standard output. To decrypt the file simply run CIPHER again using the same keyword. For example: A>CIPHER MYSTERY <NSA.CIA >SECRET.FIL This command line will read file NSA.CIA, encrypt it using the key word "MYSTERY", then write the result to file SECRET.FIL To view the original file the following command line could be used: A>CIPHER MYSTERY <SECRET.FIL This will read file SECRET.FIL, decrypt the file using the key word "MYSTERY", then write the result to standard output, which in this case is the console. FGREP This filter takes as arguments a string and optionally a series of file names. It will send to standard output all lines from the files specified in the command line that contain the string. If no files are specified FGREP will take the input from standard in. The format for the command line invocation of FGREP is: FGREP [<option>] <string> <filename>* The options available are: /v Will cause FGREP to output all lines NOT containing the specified string. /c Will cause FGREP to only print the count of lines matched in each of the files. /n Each line matched is preceded by its relative line number in the file. The string argument should be enclosed in double quotes. Two double quotes in succession are taken as a single double quote. So, A>FGREP "Fool""s Paradise" book1.txt book2.txt bible will output all lines from the book1.txt, book2.txt and bible (in that order that contain the string: Fool"s Paradise . And, A>dir b: | fgrep /v "DAT" will output all names of the files in disk b: which do not contain the string DAT . MORE The filter MORE reads from standard input, sends one screen full of information to standard output and then pauses with message: -- More -- Pressing the RETURN key will cause another screen full of information to be written to standard output. This process continues until all the input data is read. SORT [/R] [/+n] Sort reads from standard input, sorts the data, the writes the information to standard output. The sort is done using the ASCII collating sequence. There are switches which allow the user to select various options: R - Reverse the sort, that is make "Z" come before "A" +n - Sort starting with column "n" where n is some integer. The default is start the comparisons with column 1, this switch allows the user to start in any column. example: A>SORT /R <UNSORT.TXT >SORT.TXT This command line will read the file UNSORT.TXT, do a reverse sort, then write the output to file SORT.TXT A>DIR | SORT /+14 This command line will cause the output of the directory command to be piped to the sort filter, the sort filter will sort starting with column 14 (This is the column the file size starts), then send the output to the console. Thus a directory sorted by file size will be the result. To get real fancy: A>DIR | SORT /+14 | MORE will do the same thing except that MORE will give you a chance to read the directory before it scrolls off the screen. �������������������������������������