我需要使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循环中,从而绕过此问题,但这只是一个测试示例。在最终的批处理程序中,它要复杂得多,我需要从不同的代码块中多次调用函数。
答案 0 :(得分:0)
TestFunc
中倒数第二行应如下所示:
EndLocal & set "%~2=%a%"
解释是您不再处于延迟扩展块中,因此!a!
不再存在..因此您使用常规的%a%
来获取其最终值。