我正在为批处理文件构建用户名和密码功能,我让系统从2个文本文件,Uname和Pass中读取,并找到用户名和密码,但系统正在提取Pass中列出的任何密码。如何读取用户名所在的行,将密码设置为仅接受Pass文本文件中的相应行?
FOR /F "tokens=* delims=" %%x in (Users.txt) DO IF '%uname%'=='%%x' goto AdmCont
rem FOR /F "tokens=* delims=" %%x in (Pass.txt) DO IF '%code%'=='%%x' goto AdmCont
这是一个更简单的解决方案:
for /f "delims=: tokens=1,2" %A IN ('findstr /n "%uname%" Users.txt') do ( @set "number_of_line=%A" && @set "_uname=%B" )
或者,使用find
而不是findstr
(非常复杂):
for /f "eol=- delims=[] tokens=1-2" %A IN ('find /n "%uname%" Users.txt') do ( @set "number_of_line=%A" && @set "_uname=%B" )
在您的帖子中,您已经请求批处理文件代码(您有双百分号(%%
))您可以将变量的百分号加倍。
让我解释一下我的代码:
在两个循环中,我们解析命令的输出。您应该知道命令输出格式以及为什么使用findstr
要简单得多。
findstr
/n
选项和findstr
,它告诉echo
找到指定字符串的行。/n
选项之后,我们指定应在指定的文件后搜索的字符串。输出将是:
%line_number%:%content_of_line%
所以,我们解析它说:
:
符号与delims=:
选项标记为令牌!line_number
选项访问%(%)A
与content_of_line
和%(%)B
与tokens=1,2
。IN
,然后命令被解析并设置为变量行数及其内容。find
/n
选项和find
,它告诉echo
找到指定字符串的行。/n
选项之后,我们指定应在指定的文件后搜索的字符串。语法非常相似,但输出完全不同!:
---------- %FILENAME_SPECIFIED_WITH_CAPITAL_LETTERS%
[%line_number%]%line_content%
所以在这里:
-
开头的eol=-
选项。[]
将delims=[]
符号解析为标记。line_number
和%(%)A
访问line_content
,因此,我们添加%(%)B
选项。为了更好地理解这些命令的工作原理,我建议您打开一个新的cmd窗口并键入:
tokens=1,2
for /?
find /?
尝试使用findstr /?
和find
的一些例子来完全理解它们是如何工作的。
一些有趣的参考资料进一步阅读