Arrays 如何跨ENDLOCAL返回值数组

Arrays 如何跨ENDLOCAL返回值数组,arrays,batch-file,return,Arrays,Batch File,Return,我有两个可变长度的值数组,TargetName[]和TargetCpu[],需要通过ENDLOCAL边界返回。我尝试了以下方法,但只返回第一个数组上的第一个值 for /L %%i in (0,1,%MaxIndex%) do ( for /f "delims=" %%j in (""!TargetName[%%i]!"") do ( for /f "delims=" %%k in (""!TargetCpu[%%i]!"") do ( endlo

我有两个可变长度的值数组,TargetName[]和TargetCpu[],需要通过ENDLOCAL边界返回。我尝试了以下方法,但只返回第一个数组上的第一个值

for /L %%i in (0,1,%MaxIndex%) do (
    for /f "delims=" %%j in (""!TargetName[%%i]!"") do (
        for /f "delims=" %%k in (""!TargetCpu[%%i]!"") do (
            endlocal
            set TargetName[%%i]=%%j
            set TargetCpu[%%i]=%%k
        )
    )
)
Number Targets: 3
TargetName[0]: "Computer1"
TargetCpu[0] : "x64"
TargetName[1]: "!TargetName[1]!"
TargetCpu[1] : "!TargetCpu[1]!"
TargetName[2]: "!TargetName[2]!"
TargetCpu[2] : "!TargetCpu[2]!"
下面是返回值的打印

for /L %%i in (0,1,%MaxIndex%) do (
    for /f "delims=" %%j in (""!TargetName[%%i]!"") do (
        for /f "delims=" %%k in (""!TargetCpu[%%i]!"") do (
            endlocal
            set TargetName[%%i]=%%j
            set TargetCpu[%%i]=%%k
        )
    )
)
Number Targets: 3
TargetName[0]: "Computer1"
TargetCpu[0] : "x64"
TargetName[1]: "!TargetName[1]!"
TargetCpu[1] : "!TargetCpu[1]!"
TargetName[2]: "!TargetName[2]!"
TargetCpu[2] : "!TargetCpu[2]!"
我已经阅读了所有我能找到的东西,但是对于可变长度数组,我尝试过的东西都不起作用

@echo off
setlocal

set "MaxIndex=6"
call :CreateArrays
set TargetName
set TargetCPU
goto :EOF


:CreateArrays

setlocal EnableDelayedExpansion
for /L %%i in (1,1,%MaxIndex%) do (
   set /A TargetName[%%i]=!random!, TargetCpu[%%i]=!random!
)

rem Return the arrays to the calling scope
set "currentScope=1"
for /F "delims=" %%a in ('set TargetName[ ^& set TargetCPU[') do (
   if defined currentScope endlocal
   set "%%a"
)
exit /B
第一组将列出在tempfile中启动target的所有变量名

然后执行endlocal命令

然后读取文件的每一行,格式为name=value,并以set关键字作为前缀执行它

最后一组是显示结果

清理临时文件是你的事。当然,如果您有其他不希望恢复的元素,您可以使用例如

set targetname>>tempfile
set targetcpu>>tempfile
第一组将列出在tempfile中启动target的所有变量名

然后执行endlocal命令

然后读取文件的每一行,格式为name=value,并以set关键字作为前缀执行它

最后一组是显示结果

清理临时文件是你的事。当然,如果您有其他不希望恢复的元素,您可以使用例如

set targetname>>tempfile
set targetcpu>>tempfile

在发布答案之前,我可能需要更多的上下文。我不知道为什么在for/L循环的每次迭代中都调用endlocal。作为一种可能的通用解决方案,您可以在完成填充整个阵列之前启用延迟扩展,然后在“set Target”循环中使用for/f delims=%%I在末尾公开阵列。演示类似情况下的有效解决方案。区别在于它使用了一个if测试,在除第一次迭代之外的所有迭代中跳过endlocal。setlocal位于何处?在发布答案之前,我可能需要更多的上下文。我不知道为什么在for/L循环的每次迭代中都调用endlocal。作为一种可能的通用解决方案,您可以在完成填充整个阵列之前启用延迟扩展,然后在“set Target”循环中使用for/f delims=%%I在末尾公开阵列。演示类似情况下的有效解决方案。区别在于它使用了一个if测试,在除第一次迭代之外的所有迭代中跳过endlocal。setlocal位于何处?