我尝试创建一个简单的批处理文件来安装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
)
)
)
但即使我成功获得“名称”的价值,我也没有成功迭代我的“链接”数组。
怎么了?
答案 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
特殊字符可以避免在?
中将它们用作字符串文字。