我对如何从Windows批处理文件中的for循环内访问数组值感到困惑。这是我的测试:
@ echo off
SET ROOT=c:\temp\test
REM set up array of local dir paths
SET LDIR[1]=data
SET LDIR[2]=data\fonts
SET LDIR[3]=data\images
for /L %%s in (1,1,3) do (
IF EXIST %ROOT%\%%LDIR[%%s]%% (
call echo %ROOT%\%%LDIR[%%s]%% exists
) else (
call echo %ROOT%\%%LDIR[%%s]%% does not exist
)
)
我得到输出:
c:\temp\test\data does not exist
c:\temp\test\data\fonts does not exist
c:\temp\test\data\images does not exist
即使dirs存在。我相信数组在IF EXISTS语句中没有正确地去掉。这样做的正确方法是什么?另外为什么有必要使用" call"让数组正确解除引用? --Thanks!
答案 0 :(得分:1)
@ echo off
SET ROOT=c:\temp\test
REM set up array of local dir paths
SET LDIR[1]=data
SET LDIR[2]=data\fonts
SET LDIR[3]=data\images
setLocal enableDelayedExpansion
for /L %%s in (1,1,3) do (
IF EXIST %ROOT%\!LDIR[%%s]! (
echo %ROOT%\!LDIR[%%s]! exists
) else (
echo %ROOT%\!LDIR[%%s]! does not exist
)
)
endLocal
问题是你需要打电话" if与你的ECHO
es相同,但IF命令不能与CALL一起使用,所以你的最后希望是延迟扩展。这样你的表现也会提升,因为不需要{ {1}}