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.


