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