我正在为批处理文件构建用户名和密码功能,并且我可以从两个文本文件(Uname和通行证)中读取并找到用户名和密码,但是系统会提取通行证中列出的所有密码。如何读取用户名所在的行,将密码设置为仅接受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
答案 0 :(得分:0)
这是一个更简单的解决方案:
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
,因此,我们添加了tokens=1,2
选项。为了更好地理解这些命令的工作方式,建议您打开一个新的cmd窗口并键入:
for /?
find /?
findstr /?
使用find
和finstr
尝试一些示例,以完全了解它们的工作原理。
一些有趣的参考资料供进一步阅读: