INSTALLDIR erweitern mit einer Variable?
Posted 07 February 2013 - 11:04
Seit einiger Zeit Versuche ich eine Möglichkeit den INSTALLDIR Pfad bei der Installation zu erweitern. Jedoch bis jetzt war der Versuch erfolglos.
Was ich möchte:
Der MSI INSTALLDIR sollte so aussehen "C:\Program Files\Applikation %TYPE% %VERSION%"
TYPE & VERSION sollten den Standardwert "" haben.
Bei der Installation würde ich diese Werte per Befehl bestimmen
z.B.: "msiexec /i MSIFILE.msi TYPE=TEST VERSION=1.2.3 /qn"
Sodas der INSTALLDIR auf "C:\Program Files\Applikation TEST 1.2.3" zeigen sollte.
Ich weis das man den kompletten INSTALLDIR Pfad ersetzen kann, jedoch suche ich eine Lösung mit einsetzbaren Variablen.
Ist dies möglich und wenn ja, wie?
Danke
Posted 08 February 2013 - 10:33
wäre es dann nicht am einfachsten gleich den ganzen Pfad über den Aufruf zu übergeben, also:
msiexec /i MSIFILE.msi INSTALLDIR="C:\Program Files\Applikation TEST 1.2.3" /qn
Das was du vorhast geht schon ist aber um einiges aufwändiger?!
Posted 08 February 2013 - 11:25
Ja dies währe schon einfacher, jedoch muss ich eine Lösung mit diesen Variablen erstellen.
Kannst du mir einen Tipp geben wie ich dies umsetzen könnte? Auch wenn es sehr aufwendig wäre...
Posted 08 February 2013 - 13:04
als erstes müsstest du im Property-Manager drei neue Propertys anlegen zb.
MY_TYPE, MY_VERSION udn MY_DIRECTORY. Die Properties müssen GROß geschrieben werden, damit diese öffentlich sind.
Dann benötigst du noch eine Custom Action Type 51 (New Set Property)
Property Name = MY_DIRECTORY
Property Value = Application [MY_TYPE] [MY_VERSION]
Bedingung = Not Installed AND (MY_TYPE OR MY_VERSION)
Diese Cutom Action fügst du in der Execute Sequenz nach InstallFinalize ein.
Dann benötigst du noch eine Custom Action Type 35 (New Set Directory)
Property Name = INSTALLDIR
Property Value = [INSTALLDIR][MY_DIRECTORY]
Bedingung = Not Installed AND MY_DIRECTORY
Diese Cutom Action fügst du in der Execute Sequenz nach InstallInitialize ein.
Bei diesem Vorgang wird an dein Installdir Das letzte Verzeichnis angehängt. Die 2 CA's sind notwendig, weil wenn du hergehst und die beiden Propertys [MY_TYPE] und [MY_VERSION] direkt an das Installdir hängen würdes, dann würde diese Aktion ein "\" einfügen.
Wenn du die beiden Propertys aber direkt an den bestehenden Pfad mit Application anhängen willst, dann müsstest du das Installdir erst mal in das Property [MY_DIRECTORY] per CA 51 speichern, dann per Installscript aus dem Property MY_DIRECTORY] das "\" mit RemoveLastSlash abscheiden und am besten auch gleich im Script die beiden Propertys [MY_TYPE] und [MY_VERSION] anhängen und diese dann mit oben bechriebener CA35 setzen, oder eben auch im Script.
Edited by ali, 08 February 2013 - 13:05.
Posted 13 February 2013 - 16:24
Danke für deine Antwort
Ich weis nicht was ich Falsch mache, habe die beiden CA's exakt so eingefügt und die dazugehörigen Propertys erstellt, jedoch ohne irgend ein Ergebniss.
Probe schon seit über einer Woche an diesem Problem.
Irgendwie werden meine Werte die ich beim Installieren mitgebe, nicht übernohmen.
Müsste ich dies in einem Script noch definieren?
Posted 13 February 2013 - 16:29
Am, besten lässt du ein Log mitlaufen und schaust da rein, was die Properties für Werte bekommen.
/L*V %TEMP%\MyMsi.log sollte ins UserTmp schreiben.
Edited by ali, 13 February 2013 - 16:32.
Posted 15 February 2013 - 15:58
Die CA51 muss nicht nach "InstallFinalize" sondern nach "InstallInitialize"
und CA35 direkt nach CA51 augeführt werden.
So sieht mein Installationspfad so aus: "C:\Program Files\Applikation\MY_TYPE MY_VERSION".
Um jetzt noch den "\" Zwischen Applikation und den Variablen zu entfernen, habe ich ein Installscript Custom Action erstellt.
Und unter InstallScript diese Funktion erfasst. Jedoch kann ich nun keinen Build mehr erstellen?
Posted 15 February 2013 - 18:55
Nach InstallFinalze ist ja auch alles vorbei, wichtig ist, das die CA35 nach InstallInitialize kommt, da diese im (während der Laufzeit erzeugten) Script ausgeführt wird,dieses Script wird ab InstallInitialize abgearbeitet. die CA51 muss vorher kommen, vor InstallInitialize, da diese ja das Verzeichnissetzen vorbereitet.
Wieso kannst du kein Build erzeugen, was kommt für eine Fehlermeldung?
Edited by ali, 15 February 2013 - 19:07.
Posted 19 February 2013 - 15:14
CODE |
export prototype MyFunction(HWND); function MyFunction(hMSI) STRING tmpINSTALLDIR; STRING svInstalldir[256]; NUMBER nBuffer; begin tmpINSTALLDIR = INSTALLDIR; nBuffer = 256; StrRemoveLastSlash(tmpINSTALLDIR); MsiSetProperty(ISMSI_HANDLE,'INSTALLDIR',tmpINSTALLDIR); end; |
Wenn ich jedoch eine CA65536 (InstallScript) erstelle und auf diese Funktion verweise, bekomm ich ständig folgende 3 Fehler:
C:\Projektordner\Script Files\Setup.rul : fatal error F8504 Can't open .obs output file
There were errors compiling InstallScript - Error Code:4370
An error occured streaming ISSetup.ddl support file C:\Projektordner\Script Files\Setup.inx - Error Code:7132
Posted 19 February 2013 - 15:55
Posted 20 February 2013 - 11:14
Das Problem war, InstallShield erstellt den Ordner: Projektordner\"Script Files" und setzt diesen als schreibgeschützt.
Einfach Schreibschutz aufheben und gut ist.
ABER: Nach jedem Build wird der Schreibschutz wieder automatisch gesetzt was etwas mühsam ist.
Danke für die Hilfe!
Edited by tumbop, 20 February 2013 - 11:15.