Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Batch Script SET /p without a value

Creating a batch script in Windows XP. Here's a snippet of code I'm having problems with:

::==============================================================::
::How many scripts are included in this program?
SET NumOfScripts=4
::==============================================================::

:mainmenu
CLS
ECHO [MAIN MENU]
ECHO Please choose from the following options to run a particular script:
set /p choice="[1] SCRIPT1.bat | [2] SCRIPT2.bat | [3] SCRIPT3.bat | [4] SCRIPT4.bat  :  "

IF %choice% EQU 1 CALL :SCRIPT1
IF %choice% EQU 2 CALL :SCRIPT2
IF %choice% EQU 3 CALL :SCRIPT3
IF %choice% EQU 4 CALL :SCRIPT4

REM Wrong Choices
IF %choice% GTR %NumOfScripts% (
 (ECHO You have entered an invalid option. Please press any key to be taken back to the main menu.) & PAUSE & GOTO:mainmenu
)
IF %choice% LEQ 0 (
 (ECHO You have entered an invalid option. Please press any key to be taken back to the main menu.) & PAUSE & GOTO:mainmenu
)
ECHO You have entered an invalid option. Please press any key to be taken back to the main menu 
PAUSE & GOTO:mainmenu

Looking under REM Wrong Choice, the first two arguments work as they should, however, if the user enters in no value (just presses the enter key) it automatically terminates the script. I've added IF NOT DEFINED choice and that doesn't work... I also tried IF [%choice%]==[] and IF [%choice%] EQU [] and those don't work either.

Here's the funny thing... you enter an invalid digit, say 5 or -1, it will give the echoes and go back to the main menu as it should... THEN if you just press enter without a value inserted, it will echo and go back to the main menu as it should.

My question is how do you get it to recognize that the user did not enter a value for set /p on the first go?

like image 909
Anthony Miller Avatar asked May 12 '26 22:05

Anthony Miller


2 Answers

You can initialize choice to some invalid value before set /p, e.g.:

SET choice=none

To print the appropriate error message, you can do

IF %choice% EQU none (
   (ECHO You did not select an option.) & PAUSE & GOTO:mainmenu
)
like image 131
makes Avatar answered May 15 '26 10:05

makes


Set /p doesn't change the content of a variable, if the user doesn't enter text.
So you can simply set your variable to nothing to detect if the user enter anything.
Set "choice="

Or you can use the errorlevel, as it is set to 1 if the input is empty
But be careful, as it doesn't reset it to 0. So you have to force it yourself before.

cd.
Set /p choose=
If %errorlevel%==1 goto empty

And you should use the variables with delayed expansion, as it is always safe. Else a user can break your script with input like "&exit"

like image 20
jeb Avatar answered May 15 '26 11:05

jeb



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!