我制作了那种剧本:
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.
它并不取决于我在这些功能中的用途。我做错了什么?
答案 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
将不会被执行。