使用具有多个数组的循环

时间:2016-03-10 14:43:27

标签: arrays windows loops batch-file

我尝试创建一个简单的批处理文件来安装Windows CRM。 为此,我创建了2个数组,其中包含URI和下载文件的名称。

现在,我想迭代到这些数组来下载我的文件。 我这样做:

setlocal EnableDelayedExpansion

set name=(
SSCERuntime-ENU-x86.msi
SSCERuntime-ENU-x64.msi
msoidcli_64.msi
wllogin_64.msi
ReportViewer.exe
CRM2011-Client-FRA-i386.exe
)

set link=(
"http://go.microsoft.com/fwlink/p/?LinkId=147327"
"http://go.microsoft.com/fwlink/p/?LinkId=147326"
"http://go.microsoft.com/fwlink/p/?LinkId=221500"
"http://go.microsoft.com/fwlink/?LinkId=194722" 
"http://go.microsoft.com/fwlink/?LinkId=193386&clcid=0x409"
)

for %%G in %name% do echo %%G = !%%G!

SET i = 1
(for %%a in (%name%) do (
  if exist \\srv-dc22\netlogon\CRM\%%G (
  echo %%G : Already donwnloaded
)else (
  echo Downloading %%G
  powershell -command "& { iwr %link[i]% -OutFile %%G }"
  SET /A i+=1
  )
 )
)

但即使我成功获得“名称”的价值,我也没有成功迭代我的“链接”数组。

怎么了?

1 个答案:

答案 0 :(得分:2)

你的问题涉及几点......

在批处理文件中,没有针对数组的预定义支持。您仍然可以在批处理文件中模拟数组管理,充分利用批处理变量的名称可能包含几乎任何特殊字符的事实。例如,set var=123与<{1}} 相同(从批处理文件处理的角度来看)。这样,由您成功模拟批处理文件中的阵列管理。您可以在Arrays, linked lists and other data structures in cmd.exe (batch) script

上阅读有关此点的更多详细信息
set array[1]=123

在之前的代码中,&#34;链接&#34;的定义数组可以在@echo off setlocal EnableDelayedExpansion rem Define the *list* named "name" set name=SSCERuntime-ENU-x86.msi SSCERuntime-ENU-x64.msi msoidcli_64.msi wllogin_64.msi ReportViewer.exe CRM2011-Client-FRA-i386.exe rem Define the *array* named "link" set "link[1]=http://go.microsoft.com/fwlink/p/?LinkId=147327" set "link[2]=http://go.microsoft.com/fwlink/p/?LinkId=147326" set "link[3]=http://go.microsoft.com/fwlink/p/?LinkId=221500" set "link[4]=http://go.microsoft.com/fwlink/?LinkId=194722" set "link[5]=http://go.microsoft.com/fwlink/?LinkId=193386&clcid=0x409" for %%G in (%name%) do echo %%G SET i=1 for %%G in (%name%) do ( if exist \\srv-dc22\netlogon\CRM\%%G ( echo %%G : Already donwnloaded ) else ( echo Downloading %%G for %%i in (!i!) do powershell -command "& { iwr !link[%%i]! -OutFile %%G }" SET /A i+=1 ) ) 命令中以更简单(更简单)的方式完成;但是,在值中包含for特殊字符可以避免在?中将它们用作字符串文字。