Manchmal kann es vorkommen, dass in einem MSI alle GUIDs geändert werden müssen. Das kann bei umfangreichen MSI mit vielen Komponenten schnell viel Arbeit verursachen.
Glücklicherweise gibt es im PACE Suite MSI Generator die Möglichkeit Makros zu erstellen, welche solche Arbeiten schnell und zuverlässig erledigen.
Active scripting
Makros sind in PACE unter dem Punkt „Active scripting“ im Hauptmenü zu finden.
Ein Klick auf „Active scripting…“ öffnet den folgenden Dialog, in welchem einige im Standard Lieferumfang enthaltenen Makros aufgelistet sind.
Sobald auf „Add“ geklickt wurde, wird man zum nächsten Dialog weitergeleitet in welchem ein paar grundsätzliche Infos zum neuen Makro oder Scriptlet wie es in PACE genannt wird, erfasst werden können.
Script File
Aus meiner Sicht ist es empfehlenswert für jedes Scriptlet ein eigenes „Script file“ zu erstellen wie in diesem Beispiel gezeigt. Das macht die Wartung einfacher. Danach kann der gewünschte Editor ausgewählt, der Anzeigename und der Funktionsname eingetragen werden. Schon kann es mit dem Makro losgehen.
Sub ChangeUID() '-------------------------------------------------------------------- ' Purpose: Change GUIDS ' Date: 04.2018 ' Version: 1.0 ' Author: clearByte GmbH, www.clearbyte.ch '-------------------------------------------------------------------- 'Declaration ---- Dim view, record Dim oldId Dim oldProdCode, oldUpgrCode 'Processing ---- 'Change ProductCode oldProdCode = fGetProperty("ProductCode",2) UpdateData database, "UPDATE `Property` SET `Property`.`Value` = '" & GenerateGuid() & "' WHERE `Property`.`Value` = '" & oldProdCode & "'" 'Change upgradecode oldUpgrCode = fGetProperty("UpgradeCode",2) UpdateData database, "UPDATE `Property` SET `Property`.`Value` = '"& GenerateGUID() &"' WHERE `Property`.`Value` = '" & oldUpgrCode & "'" 'Change PackageCode fChangePkgCode 'Change Component codes Set view = database.OpenView("SELECT * FROM `Component`") view.Execute Set record = view.Fetch Do While (Not record Is Nothing) oldId = record.StringData(2) UpdateData database, "UPDATE `Component` SET `ComponentId` = '"& GenerateGUID() &"' WHERE `ComponentId` = '" & oldId & "'" Set record = view.Fetch Loop End Sub
In diesem Script werden sowohl zwei eigene Funktionen (fGetProperty, fChangePkgCode) als auch die allgemein verfügbare Funktion GenerateGUID() verwendet.
'FUNCTIONS Function fGetProperty(ByVal sProperty, ByVal sReturn) 'Declaration ---- Dim fView, fRecord 'Init ---- Set fView = database.OpenView("SELECT Property,Value FROM Property WHERE Property = '"&sProperty&"'") fView.Execute Set fRecord = fView.Fetch 'main ---- If fRecord Is Nothing Then fGetProperty = "" Else fGetProperty = fRecord.StringData(sReturn) End If Set fRecord = Nothing End Function Function fChangePkgCode() 'Declaration ---- Dim sumInfo 'Init ---- Set sumInfo = database.SummaryInformation(1) 'Processing ---- sumInfo.Property(9) = GenerateGUID() sumInfo.Persist database.Commit End Function
Ich hoffe, dass dem einen oder anderen dieses Script weiter hilft.