尝试通过引用 Array.Length 变量来回显数组值

尝试通过引用 Array.Length 变量来回显数组值

我正在尝试通过使用以下方式引用索引 # 来输出数组索引 # 的内容A1.长度值。但由于我仍然不完全理解变量的扩展,我得到的输出最多是实际长度值或者细绳 A1.长度。

  • 为了澄清:
A1 = The Array
A1.length = 1
A1[1] = Superuser

%~1以下示例中的参数传递的是数组 名称A1

我在底部发布了代码,清楚地显示了回显Superuser任何数组索引的值或任何实际值时失败的结果。我只得到index #或文字字符串A1.length,除非我使用需要临时变量的解决方法。

我可以通过创建一个临时变量来引用来使其工作A1.length,就像这样,但这是必需的:

set temp=!%~1.length!
echo !%~1[%temp%]!

这将输出 A1 数组中每个索引的实际内容/值,并满足我的需要。但实际上是否需要临时变量来执行此操作?

另外,为什么第一次回声有效,而第二次回声无效?

echo 1. Output: !%~1[%A1.length%]!
echo 2. Output: !%~1[%~1.length]!

%~1尽管我必须将内部参数转换为其实际值,但第一个正确解析了语句:A1

而第二个将语句解析为!A1[A1.length]!,看起来它只需要再扩展一次,但这可能吗?
添加的感叹号是否允许额外扩展。我认为使用感叹号总是将变量扩展为其最顶层或最后一级值。

无论如何,我添加了CALL第二个ECHO,并且正如预期的那样,它具有相同的输出。

  • 以下是我尝试过的一些方法:
echo 1.Output: !%~1[%~1.length]!
:: Parsed as: !A1[A1.length]!
:: Output as: 
   
call echo 2.Output: !%~1[%~1.length]!
:: Parsed as: !A1[A1.length]!
:: Output as: 
    
echo 3.Output: %~1[%%~1.length%]
:: Parsed as: A1[%~1.length]
:: Output as: A1[%~1.length]

echo 4.Output: %%%~1[%~1.length]%%%
:: Parsed as: %A1[A1.length]%
:: Output as: %A1[A1.length]%

call echo 4b.Output: %%%~1[%~1.length]%%%
:: Parsed as: %A1[A1.length]%
:: Output as: 

echo 5.Output: %~1[%~1.length]
:: Parsed as: A1[A1.length]
:: Output as: A1[A1.length]

echo 6.Output: %%~1[%~1.length]%%
:: Parsed as: %~1[A1.length]%
:: Output as: %~1[A1.length]%

call echo 6b.Output: %%~1[%~1.length]%%
:: Parsed as: %~1[A1.length]%
:: Output as: A1[A1.length]

echo 7.Output: !%~1[!%%~1.length%!]!
:: Parsed as: !A1[!%~1.length!]!
:: Output as: A1.length

call echo 8.Output: %%~1[%%~1.length]%%
:: Parsed as: %~1[%~1.length]%
:: Output as: A1[A1.length]

我遗漏了什么或忘记了什么?为什么我无法从数组中获取echo值?是否需要使用临时变量来回显数组的值?SuperuserECHO

  • 以下是演示该问题的代码:
setlocal enabledelayedexpansion

call :array-append A1 "Superuser"

goto :eof

:array-append <1=ArrayName> <2=Value> <3=Value>
    :array-append-repeat
    set %~1.length=1
    set %~1[!%~1.length!]=%~2
    :: call set %~1[%%%~1.length%%]=%~2
    echo Length=[!%~1.length!]
    
    :: Worker variable works!
    echo.&echo Using a worker variable, the following output is correct:
    set temp=!%~1.length!
    echo %~1[!%~1[%temp%]!]
    
    echo.&echo Attempting to directly ECHO the value of A1.Length
    echo None of the following works...what am I doing wrong?
    echo.
    
    echo !%~1[%~1.length]!
    :: Output> ECHO is off.
    
    echo %~1[!%~1.length!]
    :: Output> A1[1] 
    
    call echo %~1[%%%~1.length%%]
    :: Output> A1[1
    
    echo !%~1[!%~1.length!]!
    :: Output> A1.length
    
    :: call set %~1[%%%~1.length%%]=%~2
    set /a %~1.length+=1
    shift /2
    
    goto :eof

相关内容