2017-03-06 95 views
0

我试图给一个变量插入一个变量,我已经试过这一点,但没有奏效:插入变量到一个变量批量

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%-pass%

你能帮我吗?

+1

你的代码不起作用,是无法解读的。请提供例子。 – Magoo

+1

为什么你在用户之前有两倍?我们不知道你的代码是做什么的(你的代码的* intent *),所以我们不知道什么是合适的行为或“不工作”。 – abelenky

+0

而不是'%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

回答

0

这里被改写为验证输入的凭证数据批处理代码:

@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-ctCODEgabriel-pass的值时,用户输入gabriel(在任何情况下),为用户名,该命令SET必须以适当的字符串一起使用并且附加命令CALL扩大变量字符串中的环境变量。有关详细信息,请参阅Pass environment variables to subshell CMD上的示例回答。

算术表达式是set /A之后的所有内容,它由Windows命令行解释程序解释,完全不同于平时。

有关命令SETLOCALENDLOCAL的行为细节读this answer

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

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