(我将以此脚本为例)
@echo off
:start
cls
set /p x=enter the password:
if %x%==1 goto correct
echo incorrect
timeout 1 >nul /nobreak
goto start
:correct
echo correct
timeout 2 >nul /nobreak
goto start
如果我只是按回车,没有任何输入,它告诉我正确。为什么?我怎么能阻止这个?我的语法不正确吗?
另外,如果我按空格键,然后输入,批处理文件退出。 它在分裂的第二个屏幕中告诉我错误(类似于):
Goto was unexpected at this time
这让我相信我没有给出实例/定义[space]键,但我在第一个实例中删除了空格。这不意味着所有与特定标准不符的内容
if %x%==1 goto correct
会继续在脚本中,因为它的值不符合给定实例中描述的值吗?
答案 0 :(得分:2)
常见问题 - 大部分,但并非所有问题都由
解决if "%x%" EQU "1"...
如果您输入的字符串为set/p
,则说明输入的数据并不包含 Spaces 。克服这个问题的方法是"enclose the strings on both sides of the comparison operator in quotes"
- 即双引号'not single quotes'
另一个问题更微妙。按 Enter 保持x
不变 - 它不"设置"它是一个空字符串。因此,如果您开始您的程序并按 Enter ,那么"内容" x
的确是什么都没有 - 正如已经提到的那样,指令将被解析为if ==1 goto correct
,因此语法错误 - 并且对于空格条目会出现相同的语法错误。 / p>
假设您改为输入内容 - 比如说2
。 x
现在设置为2
,因此if
语句很高兴并且决定不接受分支,执行下一条指令,然后返回另一条输入。
假设您现在输入1
。 if
仍然感到高兴,接受分支,显示"正确"并等待另一个输入。
如果您只需按 Enter x
将保持不变,因此将correct
分支。
所以实际发生的事情是在 Enter 之后x
重复最后一次输入。
要解决此问题,您需要执行
set "x="
set /p x=enter the password:
首先清除x
。 set "var=value"
语法确保批处理行上的任何尾随空格不包含在分配给var
的值中。
您可以使用此特性指定默认值
set "x=hello"
set /p x=enter the password:
如果用户只是在您的提示中回复 Enter ,会将x
设置为hello
。
答案 1 :(得分:1)
改变这个:
if %x%==1
对此:
if "%x%" EQU "1"
引号包含变量,因此您总是要有一个有效的字符串进行比较,然后您必须对要比较的内容执行相同的操作以保持一致性。 EQU
是另一种比较字符串的方法(对于其他运算符,请查看if /?
。)