Walter Zackery posted two interesting solutions to obtain user input in NT:
re-posting for the world: ---------------- > W.Z., would you post your 2 methods here as well? > > Sure, no problem. These are basically just copies of my postings to the alt.msdos.batch group, with a couple of added comments. METHOD #1: Here is another method of obtaining user input in Windows NT. This one uses the FORMAT command. Anyone that's nervous about using the FORMAT command in a batch file can use my other posted method, which uses the LABEL command. Personally, I prefer this method simply because it has a cleaner input screen. This usage of the FORMAT command is absolutely safe. There is certainly no chance that your hard drive will be formatted. The command line that's used to obtain input is: format/f:160 a: > %temp%\#input# Note that the drive to be "formatted" is drive A. It doesn't really matter whether there's actually a floppy in the drive or not, the batch file will function just the same. If a floppy does happen to be in the drive, NT will refuse to format it because the parameter passed to the FORMAT command calls for a 160K floppy. I doubt seriously if there's any NT user still using 160K floppies and I doubt even more seriously if a 160K floppy would work at all in a standard floppy drive, assuming that it could even fit. So the only danger here is to a user using a non-protected 160K floppy in drive A at the time that this batch file is run. Note that for this may not work as written for non-English users because the tokens in the FOR command may be incorrect. An up-or-down adjustment of the tokens number should resolve this problem. The user input is stored in the environmental variable %INPUT%. REM Obtaining user input in Windows NT REM with the use of the FORMAT command REM posted August 20,1999 REM Author: Walter Zackery @ECHO OFF & (set input=) & cls & echo\ echo Enter your input string and press ENTER when done. echo\ & format/f:160 a: > %temp%\#input# for /f "tokens=6*" %%a in ( 'findstr \... %temp%\#input#') do if not "%%b"=="" ( set input=%%a %%b) else (set input=%%a) set input & del %temp%\#input# --------------------------------------------------------- METHOD #2: The Windows NT LABEL command can be used to obtain user input. If you type the command LABEL C: at the NT prompt, NT will prompt you for a new label. Whatever you enter at that point can be redirected to a file and then easily placed into the environment using standard NT techniques. The input string is placed into the environment as the variable %INPUT%, which the batch file will show to you. The first FOR command saves your original label for drive C as a variable. This variable is then restored later on, so that your original volume label is retained. A drawback about this procedure that I didn't catch at the time that I originally posted this is that the maximum input string is limited to 32 characters. Any input string longer than this will generate an error message and will NOT be saved to the environment. The reason for this limitation on input is that the maximum length of a drive label in NT happens to be 32 characters. The procedure posted above has no such limitation so it is the preferred procedure. REM Obtaining user input in Windows NT REM with the use of the LABEL command REM posted August 20,1999 REM Author: Walter Zackery @ECHO OFF & cls & echo\ & (set oldlabel=) for /f "tokens=6*" %%a in ('vol c:') do ( if not defined oldlabel set oldlabel=%%a %%b) (set input=) & label c: > %temp%\$input$ for /f "tokens=*" %%? in (%temp%\$input$) do (set input=%%?) set input & label c: %oldlabel% del %temp%\$input$ & (set oldlabel=) Sent via Deja.com http://www.deja.com/ Share what you know. Learn what you don't.
The FORMAT trick is broken in Windows XP, as pointed out by
Geoff Stafford -- thanks.
This could be solved by using Windows 2000's FORMAT executable.
But then again, there is no need to use dirty tricks like these in
Windows 2000 or XP: just use
SET
/P
instead.
More info on user input on my User Input page.
page last modified: 2011-03-04; loaded in 0.0019 seconds