我需要测试是否设置了一个变量。我尝试了几种技术,但每当%1被引号包围时,它们似乎都失败了,例如%1是“c:\一些带空格的路径”。

IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.

根据这个网站,这些是支持的IF语法类型。所以,我不知道该怎么做。

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

更新:在2020-10-25,我更新了接受的答案,从使用括号到使用波浪号。每个人都说波浪更好,因为它更安全。我有点撕裂,因为波浪线看起来更复杂,不太清楚它的目的是什么,但尽管如此,我改变了它。


当前回答

不幸的是,我没有足够的声誉来评论或投票目前的答案,我不得不自己写。

最初OP的问题说的是“变量”而不是“参数”,这让人非常困惑,特别是因为这是谷歌中搜索如何测试空白变量的头号链接。自从我最初的答案以来,Stephan编辑了原始问题,以使用正确的术语,但我没有删除我的答案,而是决定留下它来帮助澄清任何困惑,特别是在谷歌仍然派人来这里寻找变量的情况下:

%1不是变量!它是一个命令行参数。

非常重要的区别。后面带数字的单个百分号表示命令行参数,而不是变量。

使用set命令设置变量,并使用2%符号(一个在前面,一个在后面)回收变量。例如%myvar%

要测试空变量,您可以使用“if not defined”语法(显式变量命令不需要任何百分号),例如:

set myvar1=foo  
if not defined myvar1 echo You won't see this because %myvar1% is defined.  
if not defined myvar2 echo You will see this because %myvar2% isn't defined.

(如果你想测试命令行参数,那么我建议参考jamesdlin的答案。)

其他回答

使用!而不是“空字符串检查”

@echo off
SET a=
SET b=Hello
IF !%a%! == !! echo String a is empty
IF !%b%! == !! echo String b is empty

我根据这里的答案创建了这个小批处理脚本,因为有很多有效的答案。只要遵循相同的格式,可以随意添加:

REM Parameter-testing

Setlocal EnableDelayedExpansion EnableExtensions

IF NOT "%~1"=="" (echo Percent Tilde 1 failed with quotes) ELSE (echo SUCCESS)
IF NOT [%~1]==[] (echo Percent Tilde 1 failed with brackets) ELSE (echo SUCCESS)
IF NOT  "%1"=="" (echo Quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1]==[] (echo Brackets one failed) ELSE (echo SUCCESS)
IF NOT "%1."=="." (echo Appended dot quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1.]==[.] (echo Appended dot brackets one failed) ELSE (echo SUCCESS)

pause

我对网上的很多答案都有很多问题。大多数都适用于大多数情况,但总有一个极端情况会破坏每一个。 如果有引号,它可能不起作用,如果没有引号,它可能会中断,如果var有空格,则会出现语法错误,有些只对参数有效(而不是环境变量),其他技术允许一个空引号集作为“defined”传递,还有一些更棘手的技术不允许随后链接else。

这是一个我很满意的解决方案,如果你发现它不起作用的极端情况,请告诉我。

:ifSet
if "%~1"=="" (Exit /B 1) else (Exit /B 0)

在你的脚本中或在它自己的.bat中拥有子例程应该可以工作。 所以如果你想写(在pseudo中):

if (var)
then something
else somethingElse

你可以这样写:

(Call :ifSet %var% && (
    Echo something
)) || (
    Echo something else
)

它对我所有的测试都有效:

(Call :ifSet && ECHO y) || ECHO n
(Call :ifSet a && ECHO y) || ECHO n
(Call :ifSet "" && ECHO y) || ECHO n
(Call :ifSet "a" && ECHO y) || ECHO n
(Call :ifSet "a a" && ECHO y) || ECHO n

重复了n y n y y


更多的例子:

想看看是不是?调用:ifSet %var% && Echo set 如果不是(只有其他)呢?呼叫:ifSet %var% ||回声设置 检查传递的参数;工作很好。调用:ifSet %1 && Echo set 不想堵塞你的脚本/欺骗代码,所以你把它放在它自己的ifSet.bat?No problem:(调用ifSet.bat %var%) && Echo set) || (Echo未设置)

用方括号代替引号:

IF [%1] == [] GOTO MyLabel

圆括号是不安全的:只能使用方括号。

总结一下:

set str=%~1
if not defined str ( echo Empty string )

如果%1为“”或“”或为空,此代码将输出“空字符串”。将其添加到目前不正确的公认答案中。