批量调用FOR内部的多个子程序

时间:2014-06-05 14:10:47

标签: windows batch-processing

我制作了那种剧本:

for /F "tokens=*" %%C in (list.txt) DO (
    call :func1 %%C
    if /i %var1%==true call :func2 %%C
    if %var2%==true call :func3 %%C
)
goto:eof

:func1
some routine
goto:eof

:func2
some routine
goto:eof

:func3
some routine
goto:eof

var1和var2在func1和func2中设置。 但我只能得到这个:

C:\>samplebatch.bat
call was unexpected at this time.

它并不取决于我在这些功能中的用途。我做错了什么?

2 个答案:

答案 0 :(得分:0)

%var1%没有新值,因为您没有使用延迟扩展。

如果var1在for循环开始之前有一个值,那么它仍然具有相同的值。

答案 1 :(得分:0)

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于FOR ... DO (block)。< / p>

因此,如果未设置var1,则批处理会将if /i %var1%==true call :func2 %%C解释为if /i ==true call :func2 %%C

由于call不是cmd期望的比较运算符,因此您会收到报告的错误。

解决这个问题的简单方法是

set "var1="
for /F "tokens=*" %%C in (list.txt) DO (
    call :func1 %%C
    if defined var1 call :func2 %%C
)

其中if defined解释变量的运行时状态 - 无论是否已定义,因此如果func1定义var1,则call func2将被执行;如果func1清除var1,则call func2将不会被执行。