检查Windows批处理中的列表变量是否为空

时间:2018-04-12 11:59:08

标签: batch-file testing is-empty

我有以下程序(简化)。

事实是table变量可以包含无,一个或多个字符串值:

set table=
REM set table=geo1
REM set table=geo1,geo2,geo3

if [%table%]==[] (goto :end)

for %%a in %table% do (

    REM Some commands...

)

:end

REM Some commands...

如果table=table=geo1,则没问题。该计划表现得很好。

如果table=geo1,geo2,geo3(多个值),即使最后使用pause命令,程序也会立即关闭。

是否有一种简单的方法可以检查变量是否为空,是一个数组还是一个字符串?

2 个答案:

答案 0 :(得分:4)

您的问题是,逗号(如 space )是默认分隔符,因此cmd解释

if [%table%]==[] (goto :end)

as(eg)

if [geo1 geo2 geo3]==[] (goto :end)

因此它看到geo2期望比较运算符,生成错误消息并终止批处理。如果您直接从提示符运行,则会看到该消息。

确定变量是否为set的方法是

if defined variablename .....

if not "%variablename%"=="" .....

其中"quoting a string containing separators"解决了包含空格的问题,这与文件/目录名一样。

答案 1 :(得分:2)

您在两点处得到语法错误,其中逗号不是您想要的。

第一个问题是if命令。还有一个更好的语法(见下文)
第二个问题是for命令。还有一个更好的语法(见下文)
另一个可能的问题是set命令;有更安全的(和推荐的语法(见下文)

rem set table=
REM set table=geo1
 set "table=geo1,geo2,geo3"
if "%table%"=="" (goto :end)
for %%a in (%table%) do (
    echo Some commands with %%a...
)
:end