The code does not work if the user just hits RETURN or ENTER resulting in environment variable password
still not being defined as not defined with an initial value above line with set /p
.
This results on IF condition with immediate expansion of environment variable password
and with pass
having value xxx
in the command line:
if == xxx goto desktop
The left string is missing and therefore batch execution is exited because of a syntax error as it can be seen on running the batch file without @echo off
at top of the batch file from within a command prompt window instead of double clicking on the batch file.
Also if the entered string contains for example |
or &
or <
or >
the immediate expansion of environment variable password
result on parsing the IF condition line in a syntax error with an immediate exit of batch file execution.
The common solution to get characters with special meaning interpreted as literal characters is putting both strings to compare in double quotes. The double quotes are also compared by IF and not just the string between the double quotes. Therefore it is necessary to double quote both strings.
if "%password%" == "%pass%" goto desktop
if not "%password%" == "%pass%" goto bootscreentwo
if "%password%" == "Guest" goto ltddesktop
Which characters require double quotes around a string is explained in help of Windows command interpreter output by running in a command prompt window cmd /?
in last paragraph on last output help page. The redirection operators >
, <
and |
are missing in this list as those characters can't be used in file names.
But there is still a problem even on using double quotes around the strings to compare if the batch file user enters a string containing 1 or more double quotes as this results with immediate environment variable expansion again in a syntax error on execution of IF command line.
The solution is using delayed environment variable expansion as explained by help of command SET output on running in a command prompt window set /?
.
First suggestion for the batch code on where the user has to enter guest
for using guest access:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "pass=xxx"
:EnterPassword
set "password="
set /P "password=Enter "Guest" for guest login. Password: "
if "!password!" == "" goto EnterPassword
rem Case-sensitive password string compare using delayed expansion.
if "!password!" == "!pass!" goto desktop
rem Case-insensitive password string compare using delayed expansion.
if /I "!password!" == "Guest" goto ltddesktop
echo bootscreentwo
goto :EOF
:desktop
echo Label desktop
goto :EOF
:ltddesktop
echo Label ltddesktop
goto :EOF
Windows command interpreter does implicitly do an endlocal
on exiting batch file execution on executing goto :EOF
resulting in restoring previous command process environment.
Second suggestion for batch code with guest
being default password:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "pass=xxx"
:EnterPassword
set "password=guest"
set /P "password=Press ENTER for guest login. Password: "
rem Case-insensitive password string compare using delayed expansion.
if /I "!password!" == "Guest" goto ltddesktop
rem Case-sensitive password string compare using delayed expansion.
if "!password!" == "!pass!" goto desktop
echo bootscreentwo
goto :EOF
:desktop
echo Label desktop
goto :EOF
:ltddesktop
echo Label ltddesktop
goto :EOF
Please note that enabled delayed expansion results in interpreting !
anywhere in batch code as beginning of an environment variable reference. So be careful on using !
for example in an ECHO line as the exclamation mark must be escaped to be interpreted as literal character. It would be best to use endlocal
before further processing the batch file if the values of password
and pass
are no longer needed after this batch code block.
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "pass=xxx"
:EnterPassword
set "password=guest"
set /P "password=Press ENTER for guest login. Password: "
rem Case-insensitive password string compare using delayed expansion.
if /I "!password!" == "Guest" endlocal & goto ltddesktop
rem Case-sensitive password string compare using delayed expansion.
if "!password!" == "!pass!" endlocal & goto desktop
endlocal
echo bootscreentwo with pass and password not defined anymore.
goto :EOF
:desktop
echo Label desktop with pass and password not defined anymore.
goto :EOF
:ltddesktop
echo Label ltddesktop with pass and password not defined anymore.
goto :EOF
pass
and password
are not defined anymore after the string compares, except those two environment variables existed already before execution of SETLOCAL command in second line in which case their original values are restored by ENDLOCAL. See this answer for details about the commands SETLOCAL and ENDLOCAL.
For understanding the used commands and how they work, open a command prompt window, execute there the following commands, and read entirely all help pages displayed for each command very carefully.
echo /?
endlocal /?
goto /?
if /?
rem /?
set /?
setlocal /?