2017-02-24 93 views
-3

这里是我试图解决代码:密码系统不工作

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 

它是一个“迷你操作系统”批量制造。

+3

确实,这是一些代码。你能详细说明“不起作用”是什么意思吗?否则,这将很难帮助你。 – KernelPanic

+3

当你的代码看起来像是“使用延迟扩展”和“在%password%和%pass%周围加上引号”时,传统的对“不起作用”的回应是这样的,但老实说,已发布。 – SomethingDark

回答

2

如果用户只是点击RETURNENTER导致仍然没有被定义为不具有上述线的初始值与set /p定义的环境变量password的代码不工作。

这导致上IF条件与环境变量password立即膨胀,并与在命令行具有值xxxpass

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行中使用!时要小心,因为感叹号必须转义以解释为文字字符。如果在此批次代码块之后不再需要passwordpass的值,那么在进一步处理批处理文件之前最好使用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 

passpassword不再被定义的字符串进行比较后,除两个环境变量在第二线SETLOCAL命令在这种情况下,它们的原始值由ENDLOCAL恢复执行前已经存在。有关命令的详细信息,请参阅this answerSETLOCALENDLOCAL

为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?