2016-04-30 5 views
0

Ich schreibe eine Skriptvorlage, um mehrere MSIs zu installieren, einschließlich Fehlerprotokollierung und einer Rollback-Funktion. Es enthält Skriptblöcke zum Speichern von Installations- und Deinstallationsinformationen für jede MSI.Wie setze ich den Wert mehrerer Variablen in einem Makro im Batch?

@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%]! 

Die Idee ist, dass nur die DisplayName-, MSIPath und GUID definiert werden müssen, und die letzten 5 Zeilen des Blocks Teil einer Vorlage sein. Gibt es eine Möglichkeit, einen Marco für die letzten 5 Zeilen des Skriptblocks zu verwenden? Ich habe mit DOSKEY versucht, aber das scheint nicht im Stapel zu funktionieren, und mit all den Prozentzeichen und Ausrufezeichen wird es schwierig. Irgendwelche Vorschläge werden geschätzt!

EDIT: Hinzugefügt einige Variablen und ECHO-Befehle, um zu veranschaulichen, was die Ausgabe sein sollte; Gültige MsiExec-Befehlszeilen.

+0

Wenn die die letzten fünf Variablen sind gleich, warum sie mit einem Index erstellen? Der Umgebungsvariablenraum ist begrenzt. – lit

+0

Der Wert ist nicht derselbe, aber die Befehle install Befehl und deinstallieren haben die gleiche Definition in Bezug auf andere Variablen. Mit anderen Worten: Die Zeilen sind gleich, aber die Werte sollten für jeden MSI-Block unterschiedlich sein. – jnoort

Antwort

1

Ich fühle mich wie ein n00b, aber ich grundsätzlich herausgefunden, wie die fünf Zeilen Code zu beseitigen, durch die Skript zu:

:: 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 

und das Hinzufügen einer Funktion:

: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 
Verwandte Themen