【问题标题】:Check if user input is in txt file, with batch检查用户输入是否在txt文件中,批处理
【发布时间】:2017-09-26 00:59:36
【问题描述】:

我正在为局域网联网的计算机批量制作聊天风格系统。 我想检查用户名是否被使用,如果它不允许被选择,我如何检查用户在这一行中输入的内容(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 文件,如果我手动输入 :Yes 在用户选择名称后它将加载的位置,它将名称保存到文件中。

我想要的是:用户选择名称,它检查它是否在文件中(被占用),如果是,则使用 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 点睡眠不足我猜 :)

【问题讨论】:

  • 最好提供Users.twml 文件的示例,因为它建议使用类似于 XML 的标记语言。
  • 添加了文件的外观,它只是通过批处理行添加到文件中>> %twml% echo %user2%

标签: batch-file findstr


【解决方案1】:

你把 ||&amp;&amp; 搞混了(我也是,这就是我从不使用它们的原因)

&amp;&amp; 表示“如果成功”,即errorlevel0|| 是相反的意思。

如果找到目标字符串

findstr 将“成功”。 (嗯,当然你不想要/i - 并且/b /e 等同于/x

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

但是

您的代码仍然无法工作,因为您在文件中记录的数据前面会有一个空格。 echo 行中的任何字符,一旦重定向和目标定义被删除,除了第一个空格之外,都会被重定向到文件。你的代码是

echo
space
redirection specifier including filename
space
%user2%

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

修复使用

>> %twml% echo %user2%

redirection specifier including filename
space
echo
space
%user2%

第一个空格将重定向 voodoo 与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

对我来说很好用!

【讨论】:

  • 我用你的巫术技巧解决了添加到 users.twml 的空间,但我的主要问题 findstr 仍然无法正常工作
  • 我放弃了 findstr 只使用 find,它可以工作,但我现在遇到了另一个问题,你的巫毒技巧,也许你知道为什么,上面发布的是我正在测试但不是生产文件的新解决方案
  • 找到 ECHO 关闭的地方。是因为它是由 %user2% 使用以下命令停止它之前的回声引起的:>> Users.twml 回声。 %user2% 但 %user2% 没有保存到 users.twml 文件中,它只是保存一个空行,就像回显一样。在cmd中打印出来(空行)
  • 使用我的第一种方法将您的新解决方案复制/粘贴到一个新文件中,当我输入一个名称时运行它,它只是关闭,不写入文件,什么都没有退出。
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 2013-01-19
相关资源
最近更新 更多