我正在尝试将变量插入变量中,我试过这个,但它没有用:
set gabriel-ctCODE=fmfg1
set /p user=Username:
set /p password=Password:
set /p ctCODE=ctCODE:
if %password%== %%user%-pass% set /a loginerrorlevel=%loginerrorlevel%+1
pause
if %ctCODE%== "%%user%-ctCODE%" set /a loginerrorlevel=%loginerrorlevel%+1
if not %loginerrorlevel%== 2 goto login.incorrect
goto :aftercommand
我想将“user”变量插入此变量:%%user%-pass%
你能帮我吗?
答案 0 :(得分:1)
以下是为验证输入的凭证数据而重写的批次代码:
@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 /?