2016-04-30 6 views
0

Я пишу шаблон сценария для установки нескольких MSI, включая регистрацию ошибок и функцию отката. Он содержит скриптовые блоки для хранения информации об установке и удалении каждого MSI.Как установить значение нескольких переменных в макросе в пакетном режиме?

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 

:: Global Variables 
SET PACKAGENAME=SysinternalsSuite 
SET THISDIR=%~dp0 
SET LOGFOLDER=%TEMP%\%PACKAGENAME% 
IF EXIST "%LOGFOLDER%" RD "%LOGFOLDER%" /S /Q 
MKDIR "%LOGFOLDER%" 
SET LOGLEVEL=/lv 

:: Scriptblock 
SET /A INDEX=0 
SET DISPLAYNAME[%I%]=SysinternalsSuite.msi 
SET MSIPATH[%I%]="%thisdir%SysinternalsSuite.msi" 
SET GUID[%I%]={79D7C0BA-9E50-44E8-8D0B-56D5EA692B5E} 
SET ACTIONLOG[%I%]="%LOGFOLDER%\%I%_!DISPLAYNAME[%I%]!.log" 
SET INSTALLCOMMAND[%I%]=MsiExec.exe /i !MSIPATH[%I%]! /qn %LOGLEVEL% !ACTIONLOG[%I%]! 
SET UNINSTALLCOMMAND[%I%]=MsiExec.exe /x !GUID[%I%]! /qn 
SET EXITATERROR[%I%]=1 
SET ALLOWEDERROR[%I%]=3010 

ECHO !INSTALLCOMMAND[%I%]! 
ECHO !UNINSTALLCOMMAND[%I%]! 

Идея заключается в том, что только DISPLAYNAME, MSIPATH и GUID должны быть определены, а последние 5 строк блока будет частью шаблона. Есть ли способ, которым я могу использовать marco для последних 5 строк скриптового блока? Я пробовал с DOSKEY, но это, похоже, не работает в пакетном режиме, и со всеми признаками процента и восклицательными знаками это становится сложным. Любые предложения будут оценены!

EDIT: добавлены некоторые переменные и команды ECHO, чтобы проиллюстрировать, какой должен быть результат; допустимые командные строки MsiExec.

+0

Если последние пять переменных одинаковы, зачем создавать их с помощью индекса? Ограничение на переменное пространство среды. – lit

+0

Значение будет не таким, но команды команды установки и удаления будут иметь одинаковую определение в терминах других переменных. Другими словами: линии будут одинаковыми, но значения должны быть разными для каждого блока MSI. – jnoort

ответ

1

Я чувствую себя такой n00b, но я в основном узнал, как устранить пять строк кода, по ScriptBlock к:

:: Scriptblock 
SET /A INDEX=0 
SET DISPLAYNAME[%I%]=SysinternalsSuite.msi 
SET MSIPATH[%I%]="%thisdir%SysinternalsSuite.msi" 
SET GUID[%I%]={79D7C0BA-9E50-44E8-8D0B-56D5EA692B5E} 
Call :BuildCommandLines 

И добавление функции:

:BuildCommandLines 
    SET ACTIONLOG[%I%]="%LOGFOLDER%\%I%_!DISPLAYNAME[%I%]!.log" 
    SET INSTALLCOMMAND[%I%]=MsiExec.exe /i !MSIPATH[%I%]! /qn %LOGLEVEL% !ACTIONLOG[%I%]! 
    SET UNINSTALLCOMMAND[%I%]=MsiExec.exe /x !GUID[%I%]! /qn 
    SET EXITATERROR[%I%]=1 
    SET ALLOWEDERROR[%I%]=3010 
goto :eof