首页 > 解决方案 > 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
...

预计 的值将更改为111、212、313、414x和 515。但是如您所见,离开函数并返回主程序(内部循环)。所以循环中的下一个函数调用将“无”传递给函数调用参数中的函数,并且函数体内的变量中一遍又一遍地没有出现任何内容。x:TestFunca

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

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

标签: batch-filefor-loopvariableswindows-7

解决方案


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

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

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


推荐阅读