检查 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
我有下面的程序(简化版)。
事实是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