nather@ut-sally.UUCP (Ed Nather) (04/18/86)
The attached "shar" file includes the uuencoded version of an executable file -- use uudecode to reover the original. # This is a shell archive. Remove anything before this line, # then unpack it by saving it in a file and typing "sh file". # # Wrapped by sally!nather on Thu Apr 17 16:47:40 CST 1986 # Contents: drv.doc testdrv.bat drv.asm drv.uue echo x - drv.doc sed 's/^@//' > "drv.doc" <<'@//E*O*F drv.doc//' The new "subst" command in MS-DOS 3.1 is designed to allow the construction of ".bat" files to run older programs on a hard disk -- programs designed for earlier versions of DOS that did not understand hierarchical directories and pathnames. It almost does this, but not quite. The command subst e: c:\compile\desmet will create an equivalence such that the path "c:\compile\desmet" can be referred to as "e:" -- just like a separate drive. If that directory contains all the files needed to compile a program, then a simple .bat file that first makes "e:" the default drive and then runs the compiler should work as expected -- IF you know what drive WAS the default before you made the change. Ay, there's the rub: what drive WERE you on before you changed to "e:" -- important, since that's where your source file is. Attached is a small (9 byte) program which can be run from a .bat file and will report, in a manner a .bat file can test, the drive number of the (now) current drive. If you run this first before you change to "e:" then you will know the drive your source file is on, you can compile it, and then return to the original default drive. The attached test file "testdrv.bat" makes use of the (undocumented) feature of .batfile processing that causes an environment string to be substituted for the environment variable name if it is surrounded by %-signs. That is, if you have preset a path string, that string will be substituted, in a .bat file, for the variable name %PATH%. "testdrv.bat" shows how this works. Note that the ".bat variable" %DRV% in the example can also be used as an executable command to return control to the original default drive, and can be prepended to incoming arguments as a drive designator: C88 %DRV%%1 will become C88 c:prog if the original default drive was "c:" and the 1st argument "prog." The sequence of operations would look like this: 1. Run "drv.com" to find out the number of the current drive. 2. Save the drive designator in the environment variable "DRV". 3. Use "subst" to create a drive alias for a pathname -- say "e:". 4. Change to "drive" e:. 5. Run the program, prepending %DRV% to incoming arguments. 6. Return to the original drive by using %DRV% as a .batfile command. 7. Clean up. ("subst e: -D" removes the drive alias, "set DRV=" removes the temporary environment variable). @//E*O*F drv.doc// chmod u=rw,g=r,o=r drv.doc echo x - testdrv.bat sed 's/^@//' > "testdrv.bat" <<'@//E*O*F testdrv.bat//' :get current drive and report what it is :note that all drives beyond "e" are reported as "e:" drv if errorlevel 0 set DRV=a: if errorlevel 1 set DRV=b: if errorlevel 2 set DRV=c: if errorlevel 3 set DRV=d: if errorlevel 4 set DRV=e: echo current drive is %DRV% set DRV= @//E*O*F testdrv.bat// chmod u=rw,g=r,o=r testdrv.bat echo x - drv.asm sed 's/^@//' > "drv.asm" <<'@//E*O*F drv.asm//' ; drv - return current drive number as errorlevel CSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG ORG 100H START PROC NEAR mov ax,1900h ; get current drive number int 21h mov ah,4ch ; return AL as errorlevel int 21h START ENDP CSEG ENDS END START @//E*O*F drv.asm// chmod u=rw,g=r,o=r drv.asm echo x - drv.uue sed 's/^@//' > "drv.uue" <<'@//E*O*F drv.uue//' begin 644 drv.com )N``9S2&T3,TA ` end @//E*O*F drv.uue// chmod u=rw,g=r,o=r drv.uue echo Inspecting for damage in transit... temp=/tmp/shar$$; dtemp=/tmp/.shar$$ trap "rm -f $temp $dtemp; exit" 0 1 2 3 15 cat > $temp <<\!!! 51 413 2433 drv.doc 11 51 272 testdrv.bat 14 45 280 drv.asm 4 6 38 drv.uue 80 515 3023 total !!! wc drv.doc testdrv.bat drv.asm drv.uue | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp if [ -s $dtemp ] then echo "Ouch [diff of wc output]:" ; cat $dtemp else echo "No problems found." fi exit 0 -- Ed Nather Astronomy Dept, U of Texas @ Austin {allegra,ihnp4}!{noao,ut-sally}!utastro!nather nather@astro.AS.UTEXAS.EDU