在命令行中构建数组并在 for 循环中将它们作为单个命令调用

问题描述 投票:0回答:1

我正在尝试在命令行中构建两个数组(

arr1
arr2
,它们将具有相同的长度)以在
for
循环中引用。

从脚本构建这样的命令,

set arr1[0]="a" & set arr1[1]="b" & set arr1[2]="c" & set arr1[3]="d" & set arr2[0]="e" & set arr2[1]="f" & set arr2[2]="g" & set arr2[3]="h" & for /L %G in (1,1,3) do echo %arr1[%G]% %arr2[%G]%

但这并不是将

arr1
arr2
视为数组,而是将它们视为
strings

上面命令的输出是这样的 Command line output

我错过了什么?我尝试过其中一些变体,但似乎没有一个对我有用:

  • ... & for /L %G in (1,1,3) do echo %%arr1[%G]%% %%arr2[%G]%%
  • 使用
    &&
    作为每个命令的分隔符

我确信我错过了一些非常简单的东西,但似乎无法理解它。

注意:我确实需要将所有命令作为单个字符串,以便此命令对我有用

cmd command-line echo
1个回答
0
投票

echo %arr1[%G]% %arr2[%G]%
被解释为(空)变量
echo %arr1[%
、字符串
G[
、另一个(空)变量
% %
、字符串
arr2[
和第三个(也是空)变量
%G]%

空变量在命令行上(除了在脚本中)不显示空字符串这一事实导致输出看起来完全像要回显的内容的重复(我猜这是让您感到困惑的事实) .

好的,既然我们知道了,会发生什么以及为什么 - 如何解决它?

好吧,您需要另一层变量扩展(第一层扩展

%G
,第二层扩展用
%G
构建的变量(
arr1[1]
等)。
实现另一层解析的最简单方法是
call
命令:

...  do call echo %arr1[%G]% %arr2[%G]% 

您可以在这里大致了解正在发生的事情

如果你陷入了深深的兔子洞,请拿一大壶咖啡并阅读这个(警告 - 这是沉重的东西。准备好大脑崩溃)

为了获得“良好、不受干扰”的输出,请抑制命令重复(故障排除后。如果没有

@
,您实际上可以观看变量扩展的两个阶段):

@(set arr1[0]="a" & set arr1[1]="b" & set arr1[2]="c" & set arr1[3]="d" & set arr2[0]="e" & set arr2[1]="f" & set arr2[2]="g" & set arr2[3]="h" & for /L %G in (1,1,3) do @call echo %arr1[%G]% %arr2[%G]%)
© www.soinside.com 2019 - 2024. All rights reserved.