这里被改写为验证输入的凭证数据批处理代码:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "gabriel-ctCODE=fmfg1"
set "gabriel-pass=xxxyyy"
set "UserName="
set /P "UserName=User name: "
set "Password="
set /P "Password=Password: "
set "ctCODE="
set /P "ctCODE=ctCODE: "
call set "UserPass=%%%UserName%-pass%%"
call set "UserCode=%%%UserName%-ctCODE%%"
set "LoginErrorLevel=0"
if "!Password!" == "!UserPass!" set /A LoginErrorLevel+=1
if "!ctCODE!" == "!UserCode!" set /A LoginErrorLevel+=1
if not %LoginErrorLevel% == 2 goto LoginIncorrect
echo Entered credential data are valid for login.
goto EndBatch
:LoginIncorrect
echo Enter credential data not valid for login.
:EndBatch
endlocal
在set /P
批处理文件的用户可以自由在这种情况下,环境变量保持其当前值或仍是进入什么没有定义,如果没有定义之前。上面的批处理代码确保在提示用户之前未定义3个环境变量。
的批处理文件,用户还可以自由进入任何东西,包括像%
批处理文件执行的关键字符,>
<
,"
等,这是封闭在双引号中variable=value
分配,因为这会导致在解释原因输入字符作为文字字符,并在字符串比较中使用延迟扩展。
阅读关于Why is no string output with 'echo %var%' after using 'set var = text' on command line?和Password system does not work的更多详细信息的答案。
要获得环境变量gabriel-ctCODE
和gabriel-pass
的值时,用户输入gabriel
(在任何情况下),为用户名,该命令SET必须以适当的字符串一起使用并且附加命令CALL扩大变量字符串中的环境变量。有关详细信息,请参阅Pass environment variables to subshell CMD上的示例回答。
算术表达式是set /A
之后的所有内容,它由Windows命令行解释程序解释,完全不同于平时。
有关命令SETLOCAL和ENDLOCAL的行为细节读this answer。
要了解所用命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
echo /?
endlocal /?
goto /?
if /?
set /?
setlocal /?
你的代码不起作用,是无法解读的。请提供例子。 – Magoo
为什么你在用户之前有两倍?我们不知道你的代码是做什么的(你的代码的* intent *),所以我们不知道什么是合适的行为或“不工作”。 – abelenky
而不是'%password%== %% user%-pass%',您必须使用带有EnableDelayedExpansion的'%password%==!%user%-pass!'。此管理解释在[这个答案](http://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in-cmd-exe-batch-script/10167990#10167990)虽然主题不同... – Aacini