如果语句导致批处理文件崩溃?

如果语句导致批处理文件崩溃?

我在批处理文件中使用 IF 语句时遇到了麻烦。我已使用 set /p 对其进行了设置,但当代码到达 IF 语句时,它会关闭。此文件概述了我的意思:

@echo off  
set res1=word  
echo put in word.  
set /p ui=  
if %ui%==%res1% (goto oh)  
echo You put nothing in!  
pause  
:oh  
echo oh.  
pause

运行它但什么都不输入会导致它崩溃,不会回显文本并暂停。我做错了什么?

答案1

这是许多脚本语言中常见的问题。问题在于,在执行该行之前,变量名称会扩展为其值。如果变量留空,脚本将运行以下代码:

if ==word (goto oh)

两个等号不会被解析为相等运算符,因为 IF 期望在两边找到一个要比较的项。而不是(goto,而是期望一个运算符EQU,并且错误消息会反映这一点。

如果用户输入包含空格的字符串,也会出现类似的问题,例如:

if what I typed==word (goto oh)

这种行为可用于各种脏代码。例如,如果用户输入“word”,条件将评估为真,但如果用户输入“==word EQU”,条件也将评估为真,在这种情况下,该行将被解析为:if ==word EQU ==word (goto oh)。通常,我们不想过多地处理这些边缘情况,可以通过添加虚拟字符来避免空白变量的问题,例如:if %a%dummy==%b%dummy。这样,即使其中一个(或两个)变量为空,语法也将有效。在批处理文件中,一个特别有用的虚拟字符是“-符号,因为它还可以防止将空格解析为分隔符。以下代码应该更加健壮:

if "%ui%"=="%word%" (goto oh)

答案2

If x%ui%x==x%res1%x

不一定非要这样x。这只是一个允许空 end var 的技巧。

我通常使用它,"%ui%"=="%res1%"因为它看起来更像一种真实的语言。

我从ss64.com。很久以前。很棒的网站。

编辑:方括号是一种更安全的选择,如下所述。

答案3

如果您要测试的值中有双引号,Michael 添加双引号的解决方案可能会有问题。一种不太可能引起麻烦的方法是使用方括号:

IF [%1]==[/?] ...

Rob Van der Woude 的网站

如果 %1 本身可能包含引号,那么您就会遇到麻烦:如果 %1 等于“/?”(包括引号),则 IF "%1"=="/!" ... 计算结果为 IF ""/?”"=="/?” ...,这将生成一条错误消息。

答案4

我有一些像这样的代码:

if "%var%"=="word" (
goto top
)

现在我不确定为什么,但对于任何遇到和我一样问题的人,我通过设置一个名为 word to word 的变量,然后%var%对其进行检查来解决。如下所示。

set word = word

if "%var%"=="%word%" (
goto top
)

请注意,我使用了一个变量,而不是仅仅输入“word”。

相关内容