2017-01-03 84 views
1

我学习批处理脚本tutorialspoint现在,这里是一个非常简单的脚本:为什么在数组中使用set不能使用echo?

@echo off 

set a[0]=0 
set a[1]=1 
set a[2]=2 
set a[3]=3 
set a[4]=4 
set a[5]=5 

for /l %%n in (0,1,5) do (echo %a[%%n]%) 

为什么结果是"ECHO is off"

,如果我写这样for /l %%n in (0,1,5) do (echo a[%%n]) 我可以得到

a[0] 
a[1] 
a[2] 
a[3] 
a[4] 
a[5] 

所以为什么我不能使用echo来获取数组的值?

+1

当命令处理程序发现一个块(括号内的任何内容)时,将其完全解析并将变量扩展为块计算时的值。如果更新块中的变量值,则需要为变量启用延迟扩展以反映所做的更改。使用'setlocal EnableDelayedExpansion'并将语法从'%var%'更改为'!var!'来进行延迟扩展。 – elzooilogico

+1

关于[Windows命令解释器(CMD.EXE)如何解析脚本有一个很好的解释?](http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe -parse-scripts/4095133#4095133) – elzooilogico

+0

给定链接的有趣网站。漂亮的演示文稿,大量的描述和代码,但所有的例子都是错误的! 'set'命令中的等号前不能有空格。你可以在[这个答案]中查看批处理文件中阵列管理的详细描述(http://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in-cmd-exe-批处理脚本/ 10167990#10167990)。 – Aacini

回答

1

正如你不应该在块中使用百分比扩展(这里是一个FOR块),因为百分比在块被解析时被扩展。

改为使用延迟扩展。

setlocal EnableDelayedExpansion 
for /l %%n in (0,1,5) do (echo !a[%%n]!) 
1

下面是一个可供选择的方法,而不必使delayed expansion

for /l %%n in (0,1,5) do (call echo %%a[%%n]%%) 

环路call echo %%a[%%n]%%被解析,由于两次call的主体;在第一次变为call echo %a[0]%时,假设当前值%%n0,因为%%变为%,并且在第二次期间,%a[0]%被变量的相应值替换。


在你的方法,echo %a[%%n]%,在命令行解释器看到两个变量扩大,即%a[%%n]%,这都是不确定的,并因此成为不受任何取代。

相关问题