Batch file 批处理崩溃,带空格,即使有var集和延迟扩展
我两天前才开始编写代码。(奇怪的是,它让人上瘾)。我开始这样做是为了让我能够模拟“电脑黑客”的体验,作为我正在设计的逃生室的一部分。主要是,我只是环顾四周,找到不同的想法,并以一种审美愉悦的方式将它们组合在一起。但是,我想让它具有防撞性。因此,当人们使用它时,他们不会因为简单的按钮混合和按enter键而启动 我在:菜单中找到了这个,但在人造登录页面上没有。 下面是我编写的代码,我希望能够在其他页面上工作:Batch file 批处理崩溃,带空格,即使有var集和延迟扩展,batch-file,Batch File,我两天前才开始编写代码。(奇怪的是,它让人上瘾)。我开始这样做是为了让我能够模拟“电脑黑客”的体验,作为我正在设计的逃生室的一部分。主要是,我只是环顾四周,找到不同的想法,并以一种审美愉悦的方式将它们组合在一起。但是,我想让它具有防撞性。因此,当人们使用它时,他们不会因为简单的按钮混合和按enter键而启动 我在:菜单中找到了这个,但在人造登录页面上没有。 下面是我编写的代码,我希望能够在其他页面上工作: :menu cls set "answer=Nothing^!" set var=%v
:menu
cls
set "answer=Nothing^!"
set var=%var: =%
echo.
echo Menu
echo.
echo 1. Login
echo 2. Instructions
echo 3. Exit
echo.
set /p answer=Type the number of your option and press enter:
echo.
echo.
if /I "!answer!" == "exit" goto exit
echo You answered: %answer%
echo Which is not a valid entry.
echo Try again.
if /I %answer% == 1 goto :Login1
if /I %answer% == 2 goto :Instructions
if /I %answer% == 3 goto :Exit
if /I %answer% == 43153 goto :done
pause
goto :menu
这是我无法使用的代码
:Login2
cls
set "un=Nothing^!"
set "pw=Nothing^!"
set var=%var: =%
echo.
echo Log On
echo.
if %counter% lss 5 echo Password incorrect, %counter% attempts left
echo.
echo.
set /p un=Enter your UserID:
set /p pw=Enter your Password:
if /I %un% == ID (
if /I %pw% == PASSWORD goto :loading1
)
if /I !un! == "exit" (
if !pw! == "exit" goto loading2
goto :loading2
如果我键入一些随机输入,例如:asdf asdf
菜单没有崩溃。但是login2页面确实如此。如果用户名和密码或者只有用户名或密码有空格,它就会崩溃。如果我只是通过屏幕“输入”,它不会像菜单那样自动填充“Nothing^!”
我会将整个文件粘贴到下面,但由于我的装饰自由,它不适合这个页面。我找不到上传的地方。但如有任何意见或建议,将不胜感激
再次感谢您的帮助 始终在
IF
表达式中引用变量
IF /i "%un%" == "ID" ...
IF /i "%pw%" == "PASSWORD" ...
或者最好在这里使用延迟扩展
IF /i "!un!" == "ID" ...
IF /i "!pw!" == "PASSWORD" ...
是正确的
if /I %un% == ID (
语法正确,前提是un
包含不包含空格的简单字符串
如果un
包含一些空格
,则该命令被解释为
if /I some spaces == ID (
所需的语法是
如果[/i]string1运算符string2执行此操作
像==
这样的操作符也是一个字符串,因此cmd
会在需要操作符的地方看到空格,所以它会拒绝
若要在字符串中允许空格(和其他分隔符),请像上面对第一个if
所做的那样“引用字符串”
哦,这是关于引用的特别之处-它们必须完全匹配-你不能引用一方而不能引用另一方
这仅适用于字符串参数-如果参数是数字或解析为数字,则不使用引号。如果它们与数值参数一起使用,参数将按字母顺序进行比较,因此
98
大于123
,因为9
大于1
…除非它们是数字。un和pw在逃生室实际使用时都是字母数字。@Magoo你说得对,但即使这样,我也会在将它们放入变量之前测试它们,如果引用我的变量有什么好处?set var=%var:=%
对答案变量没有影响,你应该将它改为set“answer=!answer:=!”
我认为这回答了我的一点问题。但是我加载它,并进行测试,我做我的用户(主要是青少年和中学生)将要做的事情——混搭的东西,因为为什么不!抱歉,我还没来得及完成就已经发送了。因此,当我进入登录屏幕时,我可以输入USER作为un,ID作为密码。没问题。但孩子可能不会。他们可能会键入:Mr.Last Name--我希望它将该字符串注册为不正确的条目,然后说访问被拒绝,然后将他们跳回菜单页面,此时出现一个计数器,表示他们还有4次尝试。但是如果它不接受任何字符串。你也是这样:如果[/i]string1操作符string2做了我应该做的事情,这样我才能得到想要的效果?(例如,if/i“%un%”==“ID”(
以不区分大小写的方式将un
的内容与ID
的文字匹配,所以只有ID
(在任何情况下)将作为true
传递给密码检查。如果un
包含空格,则不会崩溃(当然也有强制执行的方法),但由于任何包含空格的字符串将与ID
不匹配,因此不会检查密码。
if /I some spaces == ID (