BATCH - 在 for 循环中调用的函数不返回值



我需要使我的批处理复杂一点,但它再次不起作用。我需要在循环for /L %%n in (1,1,%s%) do call :TestFunc中调用我的函数(它在变量中获取一些值,更改它并返回更改的值(。

在这个例子中,我想调用一个函数,该函数将值101 添加到函数调用参数中收到的值,将结果返回给主过程,我想在 for 循环中重复 5 次,将给定的结果放入下一个函数调用的参数中。

虽然我的批处理在没有循环的情况下运行良好,但在将函数调用放入这样的循环中后它就中断了:

SetLocal EnableDelayedExpansion
set "s=5"
set "x=10"
set "y=x"
echo before
echo x = !x!
echo y = !y!
for /L %%n in (1,1,!s!) do (
call :TestFunc %%n !y! !x!
echo after
echo x.2 = !x!, y.2 = !y!
timeout /t 120
)
EndLocal
exit /b
:TestFunc
SetLocal EnableDelayedExpansion
set a=%~3
set m=%~1
echo inside
echo a = !a!, m = !m!
set /a a=!a!+101
EndLocal & set "%~2=!a!"
goto :eof

结果是:

>test_variables.bat
before
x = 10
y = x
inside
a = 10, m = 1
after
x.2 = , y.2 = x
waiting 120 s, press any key to continue...
inside
a = , m = 2
after
x.2 = , y.2 = x
...

我预计x的值将变为 111、212、313、414 和 515。但如您所见,x(x.2( 的值在将函数:TestFunc离开并返回到主过程(循环内(后为">"。因此,循环中的下一个函数调用将"nothing"传递给函数调用参数中的函数,并且函数体内的变量a中一遍又一遍地出现任何内容。

在没有循环的情况下调用函数时,离开函数后x变量的值为 111,正如预期的那样。该工作代码的一个例子放在我这里帖子的"编辑"部分。

我知道我可以绕过这个问题,避免使用函数调用并将其主体代码放入 for 循环中,但这只是一个测试示例。在我的最终批处理程序中,它要复杂得多,我需要从不同的代码块调用我的函数一次以上。

TestFunc中的倒数第二行应如下所示:

EndLocal & set "%~2=%a%"

解释是你不再处于延迟扩展块中,所以!a!不再存在......所以你使用常规%a%来获取它的最终值。

最新更新