我在批处理文件中使用 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]==[/?] ...
如果 %1 本身可能包含引号,那么您就会遇到麻烦:如果 %1 等于“/?”(包括引号),则 IF "%1"=="/!" ... 计算结果为 IF ""/?”"=="/?” ...,这将生成一条错误消息。
答案4
我有一些像这样的代码:
if "%var%"=="word" (
goto top
)
现在我不确定为什么,但对于任何遇到和我一样问题的人,我通过设置一个名为 word to word 的变量,然后%var%
对其进行检查来解决。如下所示。
set word = word
if "%var%"=="%word%" (
goto top
)
请注意,我使用了一个变量,而不是仅仅输入“word”。