【问题标题】:Batch different way to access array批量访问数组的不同方式
【发布时间】:2020-01-27 19:15:46
【问题描述】:
这是我的脚本:
@echo off
setlocal EnableDelayedExpansion
set "memuc=d:\file.exe"
set array[0]=foo
set array[1]=bar
set x=0
:SymLoop
if defined array[!x!] (
call "!memuc!" start -n !!array[%x%]!!
set /A x=!x! + 1
GOTO :SymLoop
)
endlocal
- 为什么不能用
!array[%x%]! 替换array[!x!] 行?我想在访问delayedExpansion 变量时必须使用!。
- 为什么我必须使用
%x% 而不是!x!?。同样,我认为! 应该是访问x 变量的必要条件
- 为什么我必须在这里使用两个
! !!array[%x%]!!?
【问题讨论】:
标签:
batch-file
command-line
【解决方案1】:
我认为你理解错了。 ! 表示变量的值将尽可能晚地扩展。
@echo off
SETLOCAL EnableDelayedExpansion
set "_var=stackoverflow"
set "_var=rules" & echo "%_var% !_var!"
由于延迟扩展,这将打印"stackoverflow rules"。
现在回答你的问题:
附录1。原因是if defined。如果您想将实际变量放在那里,您将使用例如你的array[0] 这就是你有array[!x!] 而不是!array[%x%]! 的原因。
Addum 2. 您必须使用%x% 来立即扩展,因为您希望拥有array[0] 和array[1]。如果您将其写为!x!,那么您将进行搜索,如果写为%array[!x!]% 则为array[!x!]。
附录 3。 双感叹号 (!!) 之所以存在,是因为 call 引入了更多扩展。所以首先你有%x%的立即扩展,然后你有array[0]的扩展,然后是call的扩展。