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

Check if list variable is empty in Windows batch

我有下面的程序(简化版)。

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

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 命令,程序也会立即关闭。

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

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

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

作为(例如)

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

因此它看到 geo2 它需要比较运算符的地方,生成一条错误消息并终止批处理。如果您直接从提示中 运行,您会看到消息。

判断一个变量是否set的方法是

if defined variablename .....

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

其中 "quoting a string containing separators" 解决了 contained-spaces 的问题,就像它对 file/directorynames.

所做的一样

您在两处遇到语法错误,逗号不是您想要的。

第一个问题是 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