Jump to content


This is a ready-only archive of the InstallSite Forum. You cannot post any new content here. / Dies ist ein Archiv des InstallSite Forums. Hier können keine neuen Beiträge veröffentlicht werden.
Photo

Textdatei erstellen / ändern


25 replies to this topic

Majue

Majue
  • Full Members
  • 185 posts

Posted 24 September 2009 - 10:21

Hallo,

auf welche Weise kann ich am einfachsten eine Textdatei erstellen oder ändern?

Folgende Einträge sollen mit Hilfe von Eigenschaften in die Datei geschrieben werden:

ServerRoot "[INSTALLDIR]\apache"

Listen [PORT]

Include conf/default.conf


Gruß
JM

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Holger_G

Holger_G
  • Full Members
  • 155 posts

Posted 24 September 2009 - 13:05

Du könntest bspw. eine leere Textdatei installieren und diese dann mit einer InstallScript Custom Action (Deferred CA in System Context) entsprechend modifizieren (FileInsertLine oder entsprechenden Funktionen).


Majue

Majue
  • Full Members
  • 185 posts

Posted 24 September 2009 - 13:29

Vielen Dank für die Hilfe.

Leider kenne ich mich noch nicht mit InstallScript aus. Hast Du zufällig ein Beispiel, an dem ich sehen kann, wie meine Funktion in etwa aussehen muss? Wie kann ich z. B. die Eigenschaften verwenden?

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Holger_G

Holger_G
  • Full Members
  • 155 posts

Posted 24 September 2009 - 15:18

Sehr vereinfacht:

CODE

function MyFunction(hMSI)  
   STRING szInstallDir;
   STRING szPort;  
   STRING szFile;  
   STRING  svText;        
begin            
   szInstallDir = MsiGetCustomActionDataAttribute( hMSI, "/INSTALLDIR=" );
szPort = MsiGetCustomActionDataAttribute( hMSI, "/PORT=" );  
szFile = szInstallDir ^ "myconfig.txt";  
Sprintf(svText, "ServerRoot \"%sapache\"", szInstallDir);
FileInsertLine (szFile, svText, 0, AFTER);
return ERROR_SUCCESS;  
end;


Quellcode von MsiGetCustomActionDataAttribute gibt es hier

Dann erstellst du eine InstallScript Custom Action (Deferred CA in System Context) und setzt noch CustomActionData für diese CA. Dafür einfach eine Property mit dem Namen der CA setzen mit folgenden Inhalt:
/INSTALLDIR=[INSTALLDIR] /PORT=[PORT]

Edited by Holger_G, 25 September 2009 - 06:59.


Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 25 September 2009 - 07:33

InstallShield 2010 kann unter "Text File Changes" auch Ersetzungen in Textdateien durchführen. D.h. du könntest eine Textdatei mit dem angegebenen Inhalt installieren und dann die Platzhalter ersetzen lassen.

Majue

Majue
  • Full Members
  • 185 posts

Posted 25 September 2009 - 08:41

Vielen Dank, das hilft mir auf jeden Fall weiter! biggrin.gif

Ein kleines Problem habe ich aber noch:
wenn ich nun versuche, ein Release zu erstellen, weigert sich IS mit der Fehlermeldung "ISDEV : error -6138: Fehler beim Kompilieren von Setup.rul. Setup.rul muss im Projekt enthalten sein. Vergewissern Sie sich, dass diese Datei im Projekt enthalten ist."
Wenn ich versuche, Setup.rul unter InstallScript anzulegen, soll diese Datei schon vorhanden sein.
Der Fehler tritt aber erst dann auf, wenn ich eine benutzerdefinierte Aktion angelegt habe. Lösche ich diese wieder, ist der Fehler ebenfalls weg.

Was ist zu tun?

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Majue

Majue
  • Full Members
  • 185 posts

Posted 25 September 2009 - 08:44

Hallo Herr Krüger,

wir verwenden IS 2009, trotzdem Danke für den Hinweis. smile.gif

Gruß
JM

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Majue

Majue
  • Full Members
  • 185 posts

Posted 25 September 2009 - 09:11

Das Problem mit der Datei "Setup.rul" habe ich lösen können. Scheint wohl ein Bug von IS 2009 zu sein. Obwohl die Datei nicht mehr im Projekt enthalten war, existierte sie noch in dem Script-Ordner. Nachdem ich die Datei importiert habe, tritt der Fehler nicht mehr auf. wink.gif

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Holger_G

Holger_G
  • Full Members
  • 155 posts

Posted 25 September 2009 - 09:14

QUOTE (Majue @ 2009-09-25 08:41)
Vielen Dank, das hilft mir auf jeden Fall weiter! biggrin.gif

Ein kleines Problem habe ich aber noch:
wenn ich nun versuche, ein Release zu erstellen, weigert sich IS mit der Fehlermeldung "ISDEV : error -6138: Fehler beim Kompilieren von Setup.rul. Setup.rul muss im Projekt enthalten sein. Vergewissern Sie sich, dass diese Datei im Projekt enthalten ist."
Wenn ich versuche, Setup.rul unter InstallScript anzulegen, soll diese Datei schon vorhanden sein.
Der Fehler tritt aber erst dann auf, wenn ich eine benutzerdefinierte Aktion angelegt habe. Lösche ich diese wieder, ist der Fehler ebenfalls weg.

Was ist zu tun?

Wie hast du denn die Setup.rul Datei erzeugt?
Schau mal welche Datei(en) es in dem \Script Files Verzeichnis gibt. Sichere deine Setup.rul Datei ggf. weg, lösche dort alle Dateien und erzeuge im Projekt eine neue Script Datei (dann sollte per default Setup.rul angelegt werden). Diese kannst du ja anschliessend durch deine Setup.rul ersetzen.


Majue

Majue
  • Full Members
  • 185 posts

Posted 25 September 2009 - 10:48

Die Datei Setup.rul legt IS ja automatisch an, sobald man eine neue InstallScript-Datei erstellt. Diese habe ich dann umbenannt, was anscheinend nicht sein darf. Frage mich allerdings, warum das dann überhaupt geht! Der eigentliche Code steht in einer zweiten Datei, so dass die Setup.rul keine von mir erzeugten Daten beinhaltet.

Nun noch zwei weitere Fragen:
Gibt es eine Möglichkeit, das Script zu testen, ohne jedesmal ein neues Release erstellen zu müssen?
Wie kann ich feststellen, ob das Script während der Installation ausgeführt wird und wenn nicht, warum nicht?

Sind wahrscheinlich alles sehr laienhafte Fragen, aber ich muss mich da erst einarbeiten. blink.gif

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Holger_G

Holger_G
  • Full Members
  • 155 posts

Posted 25 September 2009 - 12:07

QUOTE (Majue @ 2009-09-25 10:48)

Nun noch zwei weitere Fragen:
Gibt es eine Möglichkeit, das Script zu testen, ohne jedesmal ein neues Release erstellen zu müssen?
Wie kann ich feststellen, ob das Script während der Installation ausgeführt wird und wenn nicht, warum nicht?

Sind wahrscheinlich alles sehr laienhafte Fragen, aber ich muss mich da erst einarbeiten.  blink.gif

Wenn du das Skript erfolgreich kompiliert hast, dann sollte es automatisch in die zuletzt erstellte MSI Datei gestreamt werden. D.h. man muss nicht zwingend ein neues Release erstellen, auch wenn die Frage bzw. Aufforderung kommt. Probier es einfach mal aus.

Du kannst eine Log Datei erstellen und bspw. auch zusätzliche Informationen in die Log Datei innerhalb einer IScript CA schreiben (mit SprintfMsiLog).

Majue

Majue
  • Full Members
  • 185 posts

Posted 28 September 2009 - 09:57

Hallo Holger,

das Script funktioniert soweit, leider werden aber die folgenden Variablen nicht gefüllt:
szInstallDir = MsiGetCustomActionDataAttribute( hMSI, "/INSTALLDIR=" );
szPort = MsiGetCustomActionDataAttribute( hMSI, "/PORT=" );


Ich habe die Eingaben nach deinem Beispiel vorgenommen, habe aber bestimmt - aus Unkenntnis - etwas wichtiges übersehen. sad.gif

Wie muss denn der Property-Eintrag aussehen? Ich habe ihn folgendermaßen erstellt:
ApacheConf | /INSTALLDIR=[INSTALLDIR] /PORT=[PORT]

Meine Funktion heißt:
function ApacheConf(hMSI)

Ich hoffe, du hilfst mir noch einmal weiter. smile.gif

Gruß
JM

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Holger_G

Holger_G
  • Full Members
  • 155 posts

Posted 28 September 2009 - 15:16

In deinem Fall dann z. B. so:

InstallScript Funktion: ApacheConf

InstallScript Custom Action (Deferred CA in System Context): ApacheConf
Set Property CA (Immediate Execution): ApacheConf_SetCAD

Property Name: ApacheConf
Propert Value: /INSTALLDIR=[INSTALLDIR] /PORT=[PORT]

Die Property CA würde ich z. B. hinter AppSearch (UI und Execute) sequenzen und die Deferred CA in der Execute Sequenz hinter InstallFiles. Dann noch ggf. sinnvolle Conditions setzen.



Majue

Majue
  • Full Members
  • 185 posts

Posted 29 September 2009 - 08:21

Hallo und danke für die Hilfe,

InstallScript Funktion: ApacheConf - OK
InstallScript Custom Action (Deferred CA in System Context): ApacheConf - OK, als benutzerdefinierte Aktion, aber was genau bedeutet "Deferred CA in System Context"?
Set Property CA (Immediate Execution): ApacheConf_SetCAD - Wo gehört dieser Eintrag hin?
Property Name: ApacheConf - OK
Propert Value: /INSTALLDIR=[INSTALLDIR] /PORT=[PORT] - OK
Die Property CA würde ich z. B. hinter AppSearch (UI und Execute) sequenzen - Könntest du das bitte etwas näher erläutern?
die Deferred CA in der Execute Sequenz hinter InstallFiles - OK
Dann noch ggf. sinnvolle Conditions setzen - Kannst du bitte ein Beispiel nennen?

Vorab schon mal danke für deine Hilfe, die mich wirklich weitergebracht hat. biggrin.gif

Bis man alle Möglichkeiten von IS nutzen kann, ist es anscheinend ein langer, beschwerlicher Weg! Zumal sind mir die englischen Begriffe nicht immer sofort klar, da ich eine deutsche Version verwende. sad.gif

Gruß
JM

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Holger_G

Holger_G
  • Full Members
  • 155 posts

Posted 29 September 2009 - 10:02

QUOTE (Majue @ 2009-09-29 08:21)

InstallScript Custom Action (Deferred CA in System Context): ApacheConf - OK, als benutzerdefinierte Aktion, aber was genau bedeutet "Deferred CA in System Context"?
QUOTE
Set Property CA (Immediate Execution): ApacheConf_SetCAD - Wo gehört dieser Eintrag hin?

Das ist eine Custom Action zum Setzen einer Property. ApacheConf_SetCAD habe ich einfach als Name für die CA gewählt. Mit dieser CA füllt man sozusagen die CustomActionData Property für die Deferred CA
QUOTE
Die Property CA würde ich z. B. hinter AppSearch (UI und Execute) sequenzen - Könntest du das bitte etwas näher erläutern?

Du kannst eine CA ja innerhalb der UI Sequenz und der Execute Sequenz ausführen. Da du ja die PORT Property bereits in der UI Sequenz setzt, würde ich die CA auch shcon in der UI Sequenz ausführen und auch in der Execute Sequenz. Für diese CA benötigst du nicht zwingend eine Condition. Bei einem Silent Setup wird die PORT Property ggf. nicht initialisiert, das solltest du evtl. auch berücksichtigen.
QUOTE
Dann noch ggf. sinnvolle Conditions setzen - Kannst du bitte ein Beispiel nennen?

Not Installed


Majue

Majue
  • Full Members
  • 185 posts

Posted 01 October 2009 - 09:18

Hallo Holger,

nun bin ich schon ein Stück weiter, habe aber noch ein kleines Problem, bei dem du mir sicherlich weiterhelfen kannst.

Die beiden Variablen in meiner CA AppacheConf (szInstallDir und szPort) werden zwar jetzt mit Daten gefüllt, allerdings steht nun folgendes darin: [INSTALLDIR] und [PORT]

Was mache ich denn nun noch falsch? Es soll ja nicht der Name der Eigenschaft verwendet werden, sondern der darin gespeicherte Wert!

Gruß
Jürgen

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Holger_G

Holger_G
  • Full Members
  • 155 posts

Posted 01 October 2009 - 10:24

Schreib doch mal genau wie der Wert der CA für die CustomAction Property lautet.
Und am besten auch den kompletten InstallScript Code.



Majue

Majue
  • Full Members
  • 185 posts

Posted 01 October 2009 - 13:56

Hallo Holger,

hier der InstallScript Code:

#include "ifx.h"
#include "customactiondata.rul"

function ApacheConf(hMSI)

STRING szInstallDir;
STRING szPort;
STRING szFileName;
STRING szFile;
STRING svText1;
STRING svText2;
STRING svText3;
STRING svResult;

begin

szInstallDir = MsiGetCustomActionDataAttribute( hMSI, "/INSTALLDIR=" ); funktioniert nicht
szPort = MsiGetCustomActionDataAttribute( hMSI, "/PORT=" ); funktioniert nicht
szFileName = "httpd.conf";
szFile = szInstallDir ^ "httpd.conf";

MessageBox (szInstallDir, 1); // zu Testzwecken
MessageBox (szPort, 1); // zu Testzwecken

Sprintf(svText1, "ServerRoot \"%sapache\"", szInstallDir);
Sprintf(svText2, "Listen %s", szPort);
Sprintf(svText3, "Include conf/default.conf");

FileInsertLine (szFile, svText1, 0, APPEND);
FileInsertLine (szFile, svText2, 0, AFTER);
FileInsertLine (szFile, svText3, 1, AFTER);

return ERROR_SUCCESS;

end;


Es klappt alles so, wie es sein soll, nur die beiden Variablen werden nicht richtig gefüllt.

Darüber hinaus habe ich zwei benutzerdefinierte Aktionen, die vermutlich noch nicht richtig funktionieren:

ApacheConf | Verzögerte Ausführung im Systemcontext
ApacheConf_CAD | Eigenschaftsname: CustomActionData | Sofortige Ausführung


Und es gibt noch folgende Property, die vielleicht auch noch fehlerhaft ist, da ja die Eigenschaftsnamen inkl. der Klammern angezeigt werden und nicht die Werte.

ApacheConf | /INSTALLDIR=[INSTALLDIR] /PORT=[PORT]

Hoffendlich kannst du weiterhelfen. Vorab jedenfalls schon mal danke für die Unterstützung!

Gruß
Jürgen


Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


mkkk

mkkk
  • Full Members
  • 63 posts

Posted 01 October 2009 - 14:27

Ich weiss nicht, ob ich da was nicht richtig verstehe, aber Properties lese ich so aus:


STRING svPath;
NUMBER nvSize;
begin
nvSize = _MAX_PATH;
MsiGetProperty(hMSI, "INSTALLDIR", svPath, nvSize);


Majue

Majue
  • Full Members
  • 185 posts

Posted 01 October 2009 - 14:40

Hallo mkkk,

das werde ich mal ausprobieren, ob es damit klappt!

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Holger_G

Holger_G
  • Full Members
  • 155 posts

Posted 01 October 2009 - 15:21

QUOTE (Majue @ 2009-10-01 13:56)

Darüber hinaus habe ich zwei benutzerdefinierte Aktionen, die vermutlich noch nicht richtig funktionieren:

ApacheConf | Verzögerte Ausführung im Systemcontext
ApacheConf_CAD | Eigenschaftsname: CustomActionData | Sofortige Ausführung


Und es gibt noch folgende Property, die vielleicht auch noch fehlerhaft ist, da ja die Eigenschaftsnamen inkl. der Klammern angezeigt werden und nicht die Werte.

ApacheConf | /INSTALLDIR=[INSTALLDIR] /PORT=[PORT]

Mit ApacheConf_CAD musst du die ApacheConf Property setzen (der Inhalt ist dann als CustomActionData Property in der ApacheConf CA verfügbar)
Also:
ApacheConf_CAD | Eigenschaftsname: ApacheConf| Sofortige Ausführung

Die MsiGetCustomActionDataAttribute InstallScript Funktion analysiert und zerlegt dann einfach den Inhalt der CustomActionData Property und erleichtert somit einfach die Arbeit.

Edited by Holger_G, 02 October 2009 - 11:02.


Majue

Majue
  • Full Members
  • 185 posts

Posted 02 October 2009 - 10:43

Eine kleine Frage noch, damit ich es dann testen kann:

QUOTE
ApacheConf_CAD | Eigenschaftsname: c| Sofortige Ausführung


Was genau soll an dieser Stelle "c" stehen? Das ist mir noch nicht ganz klar.


Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Holger_G

Holger_G
  • Full Members
  • 155 posts

Posted 02 October 2009 - 11:03

Ups, da hatte wohl Copy&Paste versagt ;-) Ich habe es oben korrigiert.

Majue

Majue
  • Full Members
  • 185 posts

Posted 05 October 2009 - 13:13

Hallo Holger,

leider funktioniert das bei mir immer noch nicht. Wahrscheinlich bin ich zu blöd dazu sad.gif !

Egal, was ich auch probiere (genau so, wie du es erklärt hast) wird bestenfalls der Name der Eigenschaft (in eckigen Klammern) angezeigt, aber nie der entsprechende Wert.

Falls du (oder jemand anderes in diesem Forum) etwas Zeit hast, sieh dir doch bitte mal den Anhang an. Für einen Profi ist es sicherlich kein Problem, den Fehler zu finden.

Gruß
JM

Edited by Majue, 05 October 2009 - 13:16.

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)


Holger_G

Holger_G
  • Full Members
  • 155 posts

Posted 05 October 2009 - 15:47

Teste doch mal das Attachment. Ich musste die .zip Datei komischerweise umbenennen.

Attached Files


Edited by Holger_G, 05 October 2009 - 15:48.


Majue

Majue
  • Full Members
  • 185 posts

Posted 06 October 2009 - 08:11

biggrin.gif

Danke Holger, jetzt klappt es! Ohne dich hätte ich wohl verzweifelt aufgeben müssen.

Gruß
JM

Edited by Majue, 06 October 2009 - 08:11.

Gruß
Jürgen Markert

(Anwender von InstallShield 2016 - Professional Edition)