批处理:无法将数组分配给变量

批处理:无法将数组分配给变量

我无法将数组分配给变量:

set persons[0].FirstName=Richard
set persons[0].lastName=DuponT
set persons[1].FirstName=Romain
set persons[1].lastName=DuponD


set x=0
REM Works:
call echo %%persons[0].FirstName%%      
call echo %%persons[%x%].FirstName%%
REM Fails:
SET var=%%persons[%x%]%%
echo %var.FirstName%

SET var=失败了,所以下面的 echo 也是失败的。如何将数组分配给变量?

答案1

正如其他人所说,批处理没有任何正式的数组或对象概念。您只是定义了 4 个环境变量,其名称看起来像一个对象数组。

环境变量名称可以包含除空值 (0x00) 或 之外的任何字符=。值可以包含除空值之外的任何字符。

您可以使用以下命令复制伪对象:

set x=0
for /f "delims=. tokens=1*" %%A in ('set persons[%x%]') do set "obj.%%B
echo %obj.FirstName%

set persons[%x%]扩展为set persons[0],它依次列出名称以 persons[0] 开头的所有环境变量。这将产生以下输出:

persons[0].FirstName=Richard
persons[0].lastName=DuponT

带有单引号括起来的 IN() 子句的 FOR /F 命令迭代命令的输出。DELIMS 选项指定标记由.字符分隔,TOKENS 选项指定第一个标记存储在 %%A 中,其余所有内容存储在 %%B 中。

因此对于第一次迭代,%%A = persons[0],且 %%B = FirstName=Richard。因此 SET 命令变为set "obj.FirstName=Richard"

如果您要批量处理复杂的数据结构,那么您可能需要了解有关延迟扩展(SETLOCAL EnableDelayedExpansion与 结合!var!而不是%var%)、批量引用和转义规则以及使用CALL双倍百分比来获得额外一轮变量扩展(您已经使用过它,但没有理解它的工作原理)的信息。这只是冰山一角。要完全理解一切是如何运作的,需要大量的神秘知识。

如果你真的想深入了解,那么请看Windows 命令解释器(CMD.EXE)如何解析脚本?

相关内容