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

时间:2019-09-08 23:28:08

标签: batch-file for-loop variables windows-7

我需要使my batch复杂一点,但再次无法使用。我需要在循环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并返回到主过程(在循环内)后,>什么都不会”。因此,循环中的下一个函数调用将“无”传递给函数调用参数中的函数,并且在函数体内的变量a中一遍又一遍都没有出现。

在不循环的情况下调用函数时,如预期的那样,离开函数后的x变量的值为111。该工作代码的示例放在my post here的“已编辑”部分。

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

1 个答案:

答案 0 :(得分:0)

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

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

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