使用批处理检查用户输入是否在txt文件中

时间:2017-09-25 01:48:15

标签: batch-file findstr

我正在为局域网联网计算机批量制作聊天方式系统。 我想检查是否使用了用户名,如果不允许它被选中,我如何检查用户在此行中输入的内容(set / p name2 =) 我在测试文件中尝试了这个,但是无法让它工作

:startup
set "fail="
set "name2="
set /p "name2=Enter Your Username: "
cls
findstr /b /e /l /c:"%name2%" <"Users.twml" >nul || set fail=1
if defined fail (
goto nope
)


:yes
cls
echo yes, you can use that
echo >> Users.twml %name2%
pause
goto endoftest



:nope
cls
echo thats taken try again
ping locahost -n 3 >nul
goto startup

问题是,即使名字没有被采纳,它也总是不行。 Users.twml文件已创建,如果我手动放置:是,在用户选择名称后将加载它将名称保存到文件。

我想要的是:用户选择名称,它检查它是否在文件中(如果是)重试goto启动,如果没有,请将其写入文件并继续。最好使用goto section命令,这样我就可以指定去哪里......

上面的代码块是我需要帮助的^^^

下面的内容是我目前使用的内容,它只是没有名称验证。

这是我目前使用的名称选择块,没有名称验证

:startup
cls
echo Pick A UserName
echo 1-16 Character limit.
set /p name2=
if "!name2!" == "" goto startup
if "!name2!" == " " goto startup
if "!name2!" == "  " goto startup
if "!name2!" == "   " goto startup
if "!name2!" == "    " goto startup
if "!name2!" == "     " goto startup
if "!name2!" == "      " goto startup
if "!name2!" == "       " goto startup
if "!name2!" == "        " goto startup
if "!name2!" == "         " goto startup
if "!name2!" == "          " goto startup
if "!name2!" == "           " goto startup
if "!name2!" == "            " goto startup
if "!name2!" == "             " goto startup
if "!name2!" == "              " goto startup
if "!name2!" == "               " goto startup
if "!name2!" == "                " goto startup
if not "!name2:~16!" == "" goto over

REM continues on after name picked if matches above requirements with stuff below

echo >> Connected.twml [System] %computername%:%username% Has joined as: %name2%
echo >> Directory.twml [System] %name2% Has joined the chat.
goto chat

这就是我试图给你一个视觉概念。 目前还没有工作

:startup
cls
echo Pick A UserName
echo 1-16 Character limit.
set "fail="
set /p name2=
if "!name2!" == "" goto startup
if "!name2!" == " " goto startup
if "!name2!" == "  " goto startup
if "!name2!" == "   " goto startup
if "!name2!" == "    " goto startup
if "!name2!" == "     " goto startup
if "!name2!" == "      " goto startup
if "!name2!" == "       " goto startup
if "!name2!" == "        " goto startup
if "!name2!" == "         " goto startup
if "!name2!" == "          " goto startup
if "!name2!" == "           " goto startup
if "!name2!" == "            " goto startup
if "!name2!" == "             " goto startup
if "!name2!" == "              " goto startup
if "!name2!" == "               " goto startup
if "!name2!" == "                " goto startup
if not "!name2:~16!" == "" goto over
REM all the above works, now lets try to check if its taken
findstr /b /e /l /c:"%name2%" <"Users.twml" >nul || set fail=1
if defined fail (
goto nope
)

REM continues on after name picked if matches above requirements with stuff below

echo >> Connected.twml [System] %computername%:%username% Has joined as: %name2%
echo >> Directory.twml [System] %name2% Has joined the chat.
echo >> Users.twml %name2%
goto chat

:nope
cls
echo thats taken try again
ping locahost -n 3 >nul
goto startup

这就是users.twml里面的内容:如果正确运行,则为yes

username1
username2
username3
username4

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

所有修复和工作我在文本文件中使用%user2%,在主文件中使用%name2%,因此难怪他们不能一起工作。仍然不理解findstr虽然...这就是为什么你不写任何形式的代码在凌晨1点睡眠不足我想:)

1 个答案:

答案 0 :(得分:2)

您已经混淆了||&&(我也这样做了,这就是我从不使用它们的原因)

&&表示&#34;如果成功&#34;即,errorlevel0||意味着相反。

findstr将&#34;成功&#34;如果找到目标字符串 。 (嗯,确定你不想要/i - 而/b /e相当于/x

如果您将||修改为&&,那么 - 好吧,也许found而不是fail ......

BUT

您的代码仍然无效,因为您在文件中录制的数据前面会有空格。 echo行中的任何字符,一旦移除重定向和目标定义而不是第一个空格,将被重定向到该文件。你的代码是

echo
space
redirection specifier including filename
space
%user2%

所以,删除重定向字符串和第一个空格会离开 Space %user2%

修复使用

>> %twml% echo %user2%

redirection specifier including filename
space
echo
space
%user2%

第一个空格将重定向伏都教与echo指令分开,第二个空格将echo与所需字符串分开。

这是我的测试设置,使用您的原始方法,cls,删除延迟并使用对我的系统来说方便的文件

@ECHO Off
SETLOCAL
:startup
SET "twml=u:\users.twml"
set "fail="
set "user2="
set /p "user2=Enter Your Username: "
REM cls
IF NOT DEFINED user2 GOTO :EOF 
findstr /X /l /c:"%user2%" <"%twml%" >nul && set fail=1
if defined fail (
 goto nope
)


:yes
REM cls
echo yes, you can use that
>> %twml% echo %user2%
goto :eof



:nope
REM cls
echo thats taken try again
:: ping locahost -n 3 >nul
goto startup
GOTO :EOF

对我来说很好用!