我正在尝试通过使用以下方式引用索引 # 来输出数组索引 # 的内容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
值?是否需要使用临时变量来回显数组的值?Superuser
ECHO
- 以下是演示该问题的代码:
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