我正在为局域网联网计算机批量制作一个聊天风格的系统。 我想检查用户名是否被占用,如果不允许,我如何检查用户在这一行中输入的内容(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 不足时编写任何形式的代码,我猜:)
最佳答案
您混淆了 ||
和 &&
(我也是如此,这就是为什么我从不使用它们)
&&
表示“如果成功”,即 errorlevel
为 0
。 ||
表示相反。
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/