Arrays 如何使用数组元素作为循环中另一个数组的索引?

Arrays 如何使用数组元素作为循环中另一个数组的索引?,arrays,indexing,cmd,Arrays,Indexing,Cmd,我有一个小问题,不能让我的头使它工作。代码如下: SET onts=3 SET port[1]=0 SET port[2]=3 SET port[3]=2 SET free[0]=8 SET free[1]=5 SET free[2]=5 SET free[3]=15 FOR /L %%A IN (1,1,%onts%) DO ( SET /A ont[%%A]=%free[%port[%%A]%]% ) echo %ont[1]% echo %ont[2]% echo %ont

我有一个小问题,不能让我的头使它工作。代码如下:

SET onts=3

SET port[1]=0
SET port[2]=3
SET port[3]=2

SET free[0]=8
SET free[1]=5
SET free[2]=5
SET free[3]=15

FOR /L %%A IN (1,1,%onts%) DO (
    SET /A ont[%%A]=%free[%port[%%A]%]%
)

echo %ont[1]%
echo %ont[2]%
echo %ont[3]%
我希望代码将变量
端口[1]
的第一个循环迭代值
0
作为索引,因此访问变量
free[0]
将其值
8
分配给变量
ont[1]
。在第二次迭代中,应使用变量
端口[2]
的值
3
来获取分配给变量
自由[3]
的值
15
,该值分配在变量
ont[2]
旁边。在第三次迭代中,从
端口[3]
读取值
2
后,变量
ont[3]
应使用
free[2]
中的值
5
进行定义

因此,输出应为:

8
15
5
但是批处理文件输出:

0
3
2
我尝试在循环中使用第二个变量:

SET /A var1 = %port[%%A]%
SET /A ont[%%A]=%free[%var1%]%
但它也不起作用

我也尝试过调用一个函数来外包这段代码,但仍然没有结果——这一次我不确定,我可能做错了什么

有人知道怎么做吗?

我建议先读一读

Windows命令处理器解析整个命令块,从
开始,以匹配的
结束,并分别用环境变量的当前值替换使用
%variable%
完成的环境变量的所有值引用。环境变量不存在

这意味着对于命令行
SET/A ont[%%A]=%free[%port[%%A]]]%
cmd.exe
在执行命令for之前,将
%free[%
解释为名为
]的环境变量的值引用,并将
%
解释为名为
的环境变量的值引用。上面为命令行定义的中既没有环境变量
free[
也没有
]
,可以预期,在启动批处理文件之前,这些环境变量根本不存在。因此,Windows command processor在预处理阶段后最终执行命令行:

FOR /L %A IN (1 1 3) DO (SET /A ont[%A]=port[%A] )
这可以在命令提示符窗口中完全按照发布的方式运行批处理文件时看到(没有通常用作第一个命令行的
@echo off

根据分配给环境变量的
ont[x]
端口[x]
的值,一个解决方案是使用一个FOR循环来获取
free[y]
的值

@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "onts=3"

set "port[1]=0"
set "port[2]=3"
set "port[3]=2"

set "free[0]=8"
set "free[1]=5"
set "free[2]=5"
set "free[3]=15"

for /L %%A IN (1,1,%onts%) do for %%B in (!port[%%A]!) do set "ont[%%A]=!free[%%B]!"

echo %ont[1]%
echo %ont[2]%
echo %ont[3]%
endlocal
此批处理文件的输出为:

8
15
5
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • echo/?
  • endlocal/?
  • 获取/?
  • 设置/?
  • setlocal/?
最后,我建议您阅读关于

的答案。您的方法需要两个(代码块实际上是三个)级别的延迟扩展,您没有使用任何延迟扩展

我的电脑演示了如何使用

s good显示了一种克服双延迟扩展的方法,使用for,
下面是另一个带有伪调用的:

:: Q:\Test\2018\11\24\SO_53458343.cmd
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
SET onts=3

SET port[1]=0
SET port[2]=3
SET port[3]=2

SET free[0]=8
SET free[1]=5
SET free[2]=5
SET free[3]=15

FOR /L %%A IN (1,1,%onts%) DO Call SET /A "ont[%%A]=%%free[!port[%%A]!]%%"

echo ont[1]=%ont[1]%
echo ont[2]=%ont[2]%
echo ont[3]=%ont[3]%

非常感谢您的详细回答
> Q:\Test\2018\11\24\SO_53458343.cmd
ont[1]=8
ont[2]=15
ont[3]=5