批次"设置/ p"没有输入时崩溃

时间:2014-03-15 02:24:04

标签: batch-file if-statement

(我将以此脚本为例)

@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

会继续在脚本中,因为它的值不符合给定实例中描述的值吗?

2 个答案:

答案 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>

假设您改为输入内容 - 比如说2x现在设置为2,因此if语句很高兴并且决定不接受分支,执行下一条指令,然后返回另一条输入。

假设您现在输入1if仍然感到高兴,接受分支,显示"正确"并等待另一个输入。

如果您只需按 Enter x将保持不变,因此将correct分支。

所以实际发生的事情是在 Enter 之后x重复最后一次输入。

要解决此问题,您需要执行

set "x="
set /p x=enter the password:

首先清除xset "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 /?。)