Batch file windows批处理中函数的局部变量和返回值

Batch file windows批处理中函数的局部变量和返回值,batch-file,Batch File,嗨 我编写了一个名为n的局部变量为test3的函数,test3从调用者那里获得一个名为ret的变量的引用作为它的参数 正如我在代码中所显示的,我希望我的test3使一个数组有三个元素,caller中名为ret的变量将保存该数组 但在caller中,当我打印数组时,我发现数组中没有三个元素 谁能帮忙?谢谢问题解决了。以下是子程序test3的工作代码: @echo off set /a n=99 echo before call test3 echo n=%n% set ret= call :

我编写了一个名为n的局部变量为test3的函数,test3从调用者那里获得一个名为ret的变量的引用作为它的参数

正如我在代码中所显示的,我希望我的test3使一个数组有三个元素,caller中名为ret的变量将保存该数组

但在caller中,当我打印数组时,我发现数组中没有三个元素


谁能帮忙?谢谢

问题解决了。以下是子程序test3的工作代码:

@echo off

set /a n=99

echo before call test3
echo n=%n%

set ret=
call :test3 ret

echo after call test3
echo n=%n%

echo show array:
echo %ret.Array[0]%
echo %ret.Array[1]%
echo %ret.Array[2]%
echo %ret.Array[3]%

ECHO Press any key to close the windows...
pause>NUL
goto :eof

:test3
setlocal
set /a n=0

:Loop-Start
if %n% GEQ 3 goto :Loop-End

endlocal

set %~1.Array[%n%]=V%n%

setlocal

set /a n=n+1

goto :Loop-Start
:Loop-End

endlocal
goto :eof

谢谢

当在子
:test3
n设置为0时,这将在第一个endlocal之后重置:循环开始。因此,下一个命令
set%~1。数组[%n%]=V%n%
仍然有n=99。如果您用返回
ret.Array[99]=V99
set ret.Array[
替换4
echo%ret.Array[…
,您可以看到这一点。因此,没有什么特别的,只是您的误解发生了什么。@LotPings在函数test3中,我希望代码:
set%~1。数组[%n%]=V%n%
变成
set%~1.Array[0]=V0
集合%1.数组[1]=V1
集合%1.数组[2]=V2
,但结果不是我想要的。一旦超出第一个
endlocal
,变量
n
获取在函数调用方
test3
定义的全局变量
n
的值,从setlocal区域传递值的唯一方法是将其放在与endlocal=>
endlocal&set%~1相同的行上。数组[%n%]=V%n%
但这不会有帮助,因为循环被终止,因为99 geq 3。@LotPings是否可以将参数设置为局部变量的值而不是windows批处理中的全局变量的值?是否有一些解决方法?抱歉,我不理解什么的参数???我解释了您的问题,如果这是指当前的问题,则问题不是o包含详细信息-否则,请提出新问题。
set\u ret=!\u ret!^&
包括设置值的尾随空格。也许您可以改为使用
set\u ret=!\u ret!^&
忽略空格。@michael_heath是
set v1=abc&set v2=def
set v1=abc&set v2=def
相同。
将终止设置值的结尾。对于第一个
v1
,值将是
abc
,第二个
abc
。如果在
echo show数组:
行后的回显项周围插入双引号,则可以查看引号之间的
V0
v1
V2
V3
值。仅查看最后一个值没有测试空间。若要修复,请省略
^&
@michael_heath之前的空格。您是对的,v1的值有一个尾随空格,v2的值是
def
在我的注释中的代码中没有尾随空格。谢谢。@user2799433您的批处理文件以及您在本答案中发布的子例程
test3
的代码生成了与用于子例程
test3
的输出完全相同,只有两行:
for/L%%i in(0,1,3)do set“%~1.数组[%%i]=V%%i”
goto:EOF
。如果不使用循环变量,而是使用环境变量
n
在每次循环迭代中递增1,就像使用延迟环境变量扩展引用的循环变量一样,使用循环v时根本不需要环境变量扩展,那么任务将变得比需要的更复杂可变的。
:test3

setlocal EnableDelayedExpansion
set /a n=0

for /l %%i in (0,1,3) do (
   set s1=V!n!

   if defined _ret (
      set _ret=!_ret! ^& 
   )
   set _ret=!_ret!set %~1.Array[!n!]=V!n!

   set /a n=n+1
)

(
   endlocal
   %_ret%
)
goto :eof