这里是我试图解决代码:密码系统不工作
set /p password= Password (Put in Guest if guest login):
if %password% == %pass% goto desktop
if not %password% == %pass% goto bootscreentwo
if %password% == Guest goto ltddesktop
:desktop
它是一个“迷你操作系统”批量制造。
这里是我试图解决代码:密码系统不工作
set /p password= Password (Put in Guest if guest login):
if %password% == %pass% goto desktop
if not %password% == %pass% goto bootscreentwo
if %password% == Guest goto ltddesktop
:desktop
它是一个“迷你操作系统”批量制造。
如果用户只是点击RETURN或ENTER导致仍然没有被定义为不具有上述线的初始值与set /p
定义的环境变量password
的代码不工作。
这导致上IF条件与环境变量password
立即膨胀,并与在命令行具有值xxx
pass
:
if == xxx goto desktop
左串丢失,因此批处理执行是因为一个退出语法错误,因为它可以在上批处理文件的顶端从命令提示窗口,而不是双击批处理文件内运行的批处理文件,而不@echo off
看到。
此外,如果所输入的字符串中包含例如|
或&
或<
或>
的环境变量password
结果上解析语法错误的IF条件符合批处理文件执行的立即退出即时膨胀。
常见的解决办法与解释为文字字符的特殊含义的字符获得是把两个字符串在双引号比较。双引号也通过IF进行比较,而不仅仅是双引号之间的字符串。因此有必要对两个字符串进行双重引号。
if "%password%" == "%pass%" goto desktop
if not "%password%" == "%pass%" goto bootscreentwo
if "%password%" == "Guest" goto ltddesktop
哪些字符需要大约一个字符串双引号在Windows命令解释器输出的帮助下在最后输出的帮助页最后一段在命令提示符窗口中运行cmd /?
解释。在列表中缺少redirection operators>
,<
和|
,因为这些字符不能在文件名中使用。
但是,即使在字符串周围使用双引号以比较批处理文件用户是否输入包含1个或更多双引号的字符串仍然存在问题,因为这会导致在执行语法错误时再次立即进行环境变量扩展IF命令行。
该溶液是用延迟的环境变量扩展为在命令提示窗口set /?
运行由命令SET输出的帮助下说明。
首先建议对其中用户必须输入guest
使用访客访问批代码:
@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命令解释程序暗中做一个endlocal
上执行goto :EOF
导致恢复以前退出批处理文件执行命令进程环境。
第二个建议批次代码guest
是默认密码:
@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
请注意,启用延迟扩展导致在批量代码解释!
作为环境变量引用的任何地方开始。因此,例如在ECHO行中使用!
时要小心,因为感叹号必须转义以解释为文字字符。如果在此批次代码块之后不再需要password
和pass
的值,那么在进一步处理批处理文件之前最好使用endlocal
。
@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
和password
不再被定义的字符串进行比较后,除两个环境变量在第二线SETLOCAL命令在这种情况下,它们的原始值由ENDLOCAL恢复执行前已经存在。有关命令的详细信息,请参阅this answerSETLOCAL和ENDLOCAL。
为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
goto /?
if /?
rem /?
set /?
setlocal /?
确实,这是一些代码。你能详细说明“不起作用”是什么意思吗?否则,这将很难帮助你。 – KernelPanic
当你的代码看起来像是“使用延迟扩展”和“在%password%和%pass%周围加上引号”时,传统的对“不起作用”的回应是这样的,但老实说,已发布。 – SomethingDark