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

标签 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 文件已创建,如果我手动将 :Yes 放在用户选择名称后加载的位置,则会将名称保存到文件中。

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

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

下面的东西是我目前使用的,它的工作原理只是没有名称验证。

这是我当前用于使用名称选择的 block ,无需名称验证即可工作

: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 内部的样子,如果:是,如果运行正确

username1
username2
username3
username4

@@@@@@@@@@ 这里有新编辑@@@@@@@@@@@@@@@@

所有固定和工作我在文本文件中使用%user2%并在主文件中使用%name2%,所以难怪它们不能一起工作。不过还是不明白 findstr...这就是为什么你不会在凌晨 1 点 sleep 不足时编写任何形式的代码,我猜:)

最佳答案

您混淆了 ||&& (我也是如此,这就是为什么我从不使用它们)

&& 表示“如果成功”,即 errorlevel0|| 表示相反。

如果找到目标字符串,

findstr 将“成功”。 (嗯,当然你不需要 /i - 而 /b/e 相当于 /x)

如果您将 || 修复为 && 那么 - 好吧,也许找到而不是失败.. .

但是

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

echo
space
redirection specifier including filename
space
%user2%

因此,删除重定向字符串和第一个空格会留下 空格%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

对我来说效果很好!

关于batch-file - 检查用户输入是否在txt文件中,使用批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46396536/

相关文章:

string - 批量 - 查找行中前 10 个字符中的字符串并打印整行

java - 运行批处理文件时当前目录无效

mysql - 使用批处理文件备份 MySQL 数据库,其中每个表都位于单独的文件中

windows - 如何将带点的批处理参数传递到 powershell 脚本中?

windows - CMake:如何在参数中用双引号调用 execute_process? a.k.a. 使用 CMake 中的查找来计算匹配字符串的行数

windows - FINDSTR 和跳过文件夹

windows - 批量删除 FTP 上早于 x 天的文件

batch-file - 使用 findstr 获取丢包的更好方法,批量

windows - 如何从第 x 行读取文件到第 y 行(dos/win 批处理文件)

batch-file - 错误 "| was unexpected at this time."