2016-03-10 5 views
0

Я пытаюсь создать простой командный файл для установки 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

Вам нужно добавить _space_ + '^' в каждую строку в ваших многострочных командах 'set' (кроме после') '), чтобы сообщить интерпретатору команд, что командная строка продолжается; в противном случае каждая строка интерпретируется как отдельная команда; _space_ служит разделителем (необходимо позже для 'for'); если какой-либо из элементов содержит пробелы или специальные символы, заключите их в '' ''; разверните переменную 'for', используя' ~ 'like' %% ~ a', чтобы удалить символ '' '' after ... – aschipfl

+0

Я пробовал то, что вы мне дали, но, похоже, не является функциональным. У меня все еще нет ссылки – f1rstsurf

ответ

2

Есть несколько пунктов, участвующих в вашем вопросе ...

в пакетных файлах нет предопределенного поддержка для массивов. Вы все же можете указать emal управление массивом в пакетных файлах, что хорошо использует тот факт, что имена пакетных переменных могут включать в себя почти любой особый символ. Например, set var=123 - тот же (с точки зрения обработки пакетных файлов), чем set array[1]=123. Таким образом, зависит от вас успешно emulate управление массивом в пакетных файлах. Вы можете прочитать более подробную информацию об этом пункте по адресу: Arrays, linked lists and other data structures in cmd.exe (batch) script

@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 команды в более простой (и менее уродливый) способом; однако включение специального символа ? в значениях позволяет избежать использования в качестве строковых литералов в for.

+0

Спасибо, это работает – f1rstsurf

Смежные вопросы