1. QUICK START
ASK allows you to ask for input from the user in a batch file. The
simplified syntax is
ASK [prompt] [expected Keys]
Prompt is a "quoted" string that will be printed by ASK. Expected
keys is a list of key that you expect from the user. The result
is testable by the "if errorlevel" statement in a batch file. For
example (in a batch file):
ask "Do you want to run away (y/n)? " yn
if errorlevel 2 goto no
rem *** errorlevel 1 falls thru here. Now run away.
When the user runs this batch file, he will get this prompt:
Do you want to run away (y/n)? _
He can press the 'y' or the 'n' key. If he presses the 'y'
key, errorlevel will be set to 1 (because y is the first
character in the expected keys list) and away will be run.
If he presses the 'n' key, errorlevel will be set to 2 and
away will not be run.
This should get you started. There are some other examples
in this document as well as in the file EXAMPLE.BAT (which
you can run).
ASK is a program for you to use in a batch file to ask for one-
key responses from the user. ASK then sets the errorlevel
according to the key pressed. The errorlevel can be tested in a
batch file to branch to different places. This allows you to ask
simple questions like the Yes-or-No type, or to set up a menu-
driven batch file. ASK also accepts options like no echo, time
out, flush type-ahead.
ASK [Options] [Prompt] [Expected Keys]
[Prompt] is the question to be displayed. It is a "quoted string"
(double quotes only). You can embbed double quotes in the prompt
by using \" (backslash-quote). If you do not supply [Prompt], ASK
will use the default '? '. If you want an empty prompt, use "".
2.2.2 [Expected Keys]
[Expected Keys] is a string of all the different keys that the
user may press in response to your question. There is no need to
quote this string unless you want to include a space in it.
Another way to include a space is to use '\ ' (blackslash-space).
If the user presses the first key listed in the [Expected Keys],
the errorlevel will be set to 1; if the user presses the second
key in the [Expected Keys], the errorlevel will be set to 2, and
so on. If the user presses a key that is not in the [Expected
Keys], ASK will beep and prompt him again until he gets it right.
You can override this action with the /q option.
If the [Expected Keys] string is not present, the errorlevel will
be set to the character code of the key the user pressed. By
default, lower case letters will be mapped to the upper case
counterpart, i.e. letters always return 65-90. You can disable
this mapping with the /c option.
If there is no [Expected Keys] and the user presses a key that
maps to an extended ASCII, ASK returns 0 (zero). The only way to
match a function key is to list that key in [Expected Keys].
When testing errorlevel, be sure to test for the highest number
if errorlevel 5
if errorlevel equal to or greater than 5.
Options are used to change the behavior of ASK somewhat. The
option letters themselves are not case sensitive so you can use
either upper or lower case.
/F - flush all keys type-ahead before accepting input
/E - no echo. Accept input but do not echo it to the
screen. The cursor is also turned off during input.
/Q - be quiet, don't yell at the user for invalid
response, but return 0 as the errorlevel. This
option is meaningless if there is no [Expected
Keys]. This is normally used when you want to trap
invalid responses and print your own error message
instead of using the built-in one.
/C - make [Expected Keys] case sensitive. This means
letters pressed by the user will only match letters
in the same case in [Expected Keys]. If there is
no [Expected Keys], then UPPER case letters will
return errorlevel 65-90, and lower case letters will
/Sxxx - timeout after xxx seconds and return errorlevel 255.
xxx can be from 1 to 3 digits and range from 0 to
If you supply 0 (zero) as the timeout value, ASK
will check the keyboard buffer once before it times
out. If there is a key in the buffer (typed ahead),
ASK will read it.
If you do not supply any value, ASK will time out
immediately without even checking type-ahead keys in
the keyboard buffer. You can use ASK this way as an
alternative to DOS' ECHO command. The advantage is
that you can use ASK to print control characters. E.g.
ask/s "\e" > E.TXT will put the escape character in
the file E.TXT.
If more than one timeout option is given, the effect
is cumulative. Accuracy is from +0 to -1 second. So
if you say s10 it would delay from 9 to 10 seconds.
When ASK times out it will not print a linefeed so
that the next thing you ECHO will appear immediately
after the [prompt]. I usually print *TIMEOUT* so if
a user is watching he will understand why things are
happening even though he didn't press any key.
/Myyy - timeout after yyy minutes and return errorlevel 255.
yyy can be from 1 to 3 digits and range from 0 to
999. See the /S option for other details.
More than one option letter can share a common switch, like
ask /QS50C "Blah Blah? "
ask/qcm5 "Blah Blah? "
ask /c/s9/q "Blah Blah ?"
2.4 Special Characters
Characters that you normally cannot put on a command line (e.g.
carriage return, escape, backspace, ...) can be included in
either [Prompt] or [Expected Keys] using the following
\nnn - translates to ASCII nnn where nnn is a 3-digit
decimal number. If this is not followed by another
digit then you don't need to put down all three
digits. If it is followed by a digit, then you have
to put down all three digits (add leading zeros if
ASK "\7HI: " prints a beep and "HI: "
ASK "\0070 HI: " prints a beep and "0 HI:"
ASK "\070 HI: " prints "F HI: "
\e - the escape character. This is equivalent to \27,
\027, or \E.
\\ - the \ (backslash) character itself
\" - the double quote character (without the backslash it
will be interpreted as the beginning or the end of a
\~ - the tilde character itself.
~a - translates to control-a. This works when 'a' is from
ASCII 64 to 95 (which produce ASCII 0 thru 31) or is
a lower case letter.
~(X) - interpret this as a function key. X is the label on
the function key. E.g. ~(f1) refers to the key (F1),
~(ins) refers to the (Ins) key.
The label is not case sensitive, so you can use upper
or lower case. So ~(F1), ~(INS) would also work.
You can use the prefixes S-, C-, and A- with the
labels to denote Shift-, Ctrl-, and Alt- version of
the key, like ~(s-f1), ~(c-f1), and ~(a-f1).
This notation is only recognized in [Expected Keys]
and not in [Prompt], because function keys cannot be
Here's some examples on using special characters:
ask "How \"are\" you?" - will produce How "are" you?
ask "Hi?\7" - will produce Hi?*BEEP*
ask "Hi?~g" - will also produce Hi?*BEEP*
ask "hi" ~m - will let the user use the enter
key as a valid response
ask "Press (F1)" ~(f1) - wait for user to press the (F1)
If you want to use function keys, you should know that not all
keys have a Shift-, Alt-, or Ctrl- version. For instance, Ctrl-
Del produces nothing. If you are not sure what a certain
combination will produce, let ASK help you. Simply type
and press the key in question. ASK will echo the key you just
pressed. If you press Ctrl-PgUp, you'll see this:
The '?' is the default prompt provided by ASK because you didn't
supply one. The (C-PgUp) is the echo of the key you just pressed.
Now you know you can use ~(c-pgup) in the [Expected Keys] to
match this key. If you had pressed Ctrl-Del, the effect is like
you didn't press any keys.
The errorlevel is set to 0 for an extended ASCII if no [Expected
Keys] is supplied, like in this case.
2.5 Other use
You can use ask for many other purposes:
1) As an ECHO command that lets you print control characters.
E.g. ask/s \7beep!
2) As a delay command. E.g. ask/m60 > nul (delay 60 minutes).
3) As a PAUSE command with your own prompt.
E.g. ask/e "Wake me up when ready ..."
4) Used it to flush type-ahead in a batch file before running
another program. E.g. ask/fs
These usages might not seem very useful, but they might inspire
you to think of something useful.
Here are some examples on how you could use ASK to improve your
If many people use your computer and say a new version of EDLIN
just arrived, you can name the old one EDLIN1 and name the new
one EDLIN2, and put the following in EDLIN.BAT:
echo "(F1) EDLIN old version"
echo "(F2) EDLIN new version"
ask/e "Choose one - Press (F1) or (F2)" ~(f1)~(f2)
if errorlevel 2 goto new
When people entered EDLIN, they'll run this batch file and be
given a choice of which version to use. This way you don't have
to tell everybody that a new version of EDLIN is installed.
Here's an example that allows the user to indicate the default
response by hitting the Enter key:
ask "Should I do it or not (Y/N) [default Y]? " \13yn
rem ** errorlevel = 3 means n key
rem ** errorlevel = 2 means y key
rem ** errorlevel = 1 means return key
if errorlevel 3 goto no
Now if the user press the Enter key, the computer will DoIt. Note
that \013 can be abbreviated as \13 when it is not followed by
another numeric character.
I like to run chkdsk once in a while but if I don't put it in the
AUTOEXEC>BAT file I'll forget to run it. On the other hand, I
don't want to run it every time I boot because it takes a while.
So I put this in my autoexec.bat:
ask/s30 "Run chkdsk (y/n) [n]? " yn~m
if not error 255 goto timein
echo Running chkdsk. Take your time in the bathroom.
if errorlevel 2 goto nocheck
Normally when I boot the computer I'll just hit Enter to the "Run
chkdsk" question to skip chkdsk. But sometimes I'll turn on the
machine and go to the bathroom. In that case ASK will time out
after 30 seconds and start running chkdsk. By the time I come
back from the bathroom chkdsk will be done and I've wasted no
In this case, I'll see this on the screen when ASK times out:
Run chkdsk (y/n) [n]? *TIMEOUT*
Running chkdsk. Take your time in the bathroom.
If you use ANSI.SYS or similar screen driver, you can use ASK to
set color or screen mode. For example:
ask/s "\e[32m" -- set foreground to green
To restore your screen to normal white on black, type
The quotes can be omitted in this case since there are no spaces
in the prompt string.
The idea for ASK came from a program called BATQUES contributed
to the INFO-IBMPC library (an electronic library on the ARPANET)
by H. Fischer. The motivation for writing ASK is to avoid the
need for an ASCII table (to use BATQUES).
This is the second version of ASK (the previous one is ASK.ASM).
This version has the following changes/additions:
1) The program is written in C (IBM C 1.0, compatible with
MS C 3.0). Using C allows me to add more functions easily at
the cost of increased execution code size. But I think it's
2) There are two special characters: \ (backslash) and ~
3) Support for function keys.
4) New options: time out, no echo, flush type ahead.
5) Comes with a demo batch file.
If you are switching to this version from the old version, you
have to change the special character from ^ to \ or ~ in your
existing batch files that use ASK.
Faculty Support Center
1210 W. Dayton Street, B106
University of Wisconsin, Madison
Madison, WI 53715
Electronic mail addresses:
arpa: [email protected]
bitnet: WU at WISVMACC
Feedback, bug-report, and comments are welcome.