Installer-Kurs 2/6

von
André Wyrwa
Hier eine Übersicht über die Inhalte der einzelnen Kursteile:
  1. Einführung, Überblick, Grundlagen
  2. Kommunikation mit dem User, grundlegende Kommandos
  3. Dateioperationen
  4. weiterführende Funktionen und Statements
  5. Scriptoptimierung, Lokalisierung
  6. Tricks für Fortgeschrittene, Tools
Teil 2:

Im letzten Kursteil haben wir uns mit den allgemeinen Grundlagen der Installer-Programmierung vertraut gemacht. Nun sollen die ersten Befehle und vor allem die Kommunikation mit dem User eine Rolle spielen.

Bevor wir uns der Kommunikation mit dem User widmen, wollen wir uns zunächst das (SET )-Statement ansehen, das dazu dient, Variablen einzurichten und mit Inhalt zu füllen.

(SET )

Schablone:
(set <variable> <inhalt> [<variable> <inhalt> ...])
Funktion:
Das (SET )-Statement weist der Variablen <variable> den Wert <inhalt> zu. Existiert die Variable noch nicht, so wird sie erstellt (deklariert). Es können auch mehrere Variablen durch ein (SET )-Statements auf einmal belegt werden.
Rückgabe:
(SET ) liefert den zuvor enthaltenen Inhalt der Variablen.
Bemerkung:
Das (SET )-Statement kann auch dazu benutzt werden, Variablen vom Typ STRING in solche vom Typ INTEGER zu wandeln:

(set <integer-var> (+ <string-var>))

Um diese Konvertierung umgekehrt auszuführen, benutzt man (CAT ).

Im folgenden werden die Beschreibungen der Kommandos hier nicht mehr auftauchen, sondern können unter Befehle eingesehen werden.

Nachdem wir uns diesem grundlegenden Statement zugewandt haben, wollen wir nun gleich den Kontakt zum User aufnehmen. Dies tut fürs erste folgendes Beispiel-Script (Achtung: Bei Ausführung dieser Beispiele immer einen anderen Userlevel als NOVICE wählen!):

Bsp.1

(set #string "Der AmZeiger ist einfach Klasse.")
(message #string)
(message "Aber das wußten wir ja schon.")

Das hier verwendete Kommando (MESSAGE ) dient der einfachen Ausgabe von Text, ist also für Hinweise an den User recht nützlich. Wie man hier sieht, kann entweder eine Variable oder aber direkt ein String angegeben werden. Der Installer behandelt Strings (und ebenso auch Zahlen) also wie Variablen.

Nun ist das bloße Ausgeben von Text natürlich eine ziemlich langweilige Form von Interaktion, weswegen wir uns im folgenden eine Reihe von Kommandos ansehen wollen, bei denen der User etwas mehr zum Zuge kommt. Sie entsprechen in ihrer Funktion in etwa den verschiedenen Requestern, die man vom Amiga-OS her kennt.

Damit das ganze aber nicht zu langweilig wird, machen wir zuvor noch einen kleinen Exkurs zu den wichtigsten Control-Statements, also solchen Statements, die den Programmablauf beeinflussen. Sie lassen sich grob in zwei Klassen einteilen: die Verzweigungen und die Schleifen.

Verzweigungen dienen dazu, anhand verschiedener gegebener Bedingungen verschiedene Programmteile (Kommandosequenzen) abzuarbeiten. Zu den Verzweigungen gehören (IF ) und (SELECT ).

Schleifen dienen dazu, eine Kommandosequenz mehrfach abzuarbeiten, wobei natürlich Variableninhalte verändert werden können. Der Installer verfügt über die Schleifen (WHILE ), (UNTIL ) und (FOREACH ). Mit letzterer befassen wir uns erst in einem späteren Kursteil.

Da wir nun die Theorie der Verzweigungen und Schleifen kennen, stürzen wir uns als nächstes gleich in die Praxis und lernen anhand des folgenden Beispiels die Control-Statements zu gebrauchen und die oben bereits angesprochenen Funktionen zur Interaktion mit dem User kennen.

Bsp.2
    (set #i 1)
    (while (= #i 1)
     (
      (set #auswahl
       (askchoice
        (prompt "Bitte wählen Sie eine Funktion aus, die Sie testen möchten.")
        (help @askchoice-help)
        (choices "Verzeichnis erfragen (askdir)"
                 "Datei erfragen (askfile)"
                 "Texteingabe (askstring)"
                 "Zifferneingabe (asknumber)"
                 "Optionswahl (askoptions)"
                 "Diskette erbitten (askdisk)"
        )
        (default 2)
       )
      )
      (select #auswahl
       (set #ergebnis
        (askdir
         (prompt "Bitte wählen Sie ein Verzeichnis aus.")
         (help @askdir-help)
         (default @default-dest)
        )
       )
       (set #ergebnis
        (askfile
         (prompt "Bitte wählen Sie eine Datei aus.")
         (help @askfile-help)
         (default @icon)
        )
       )
       (set #ergebnis
        (askstring
         (prompt "Wenn Sie etwas loswerden möchten, so haben Sie jetzt "
                 "Gelegenheit dazu.")
         (help @askstring-help)
         (default "Sie müssen natürlich nicht.")
        )
       )
       (set #ergebnis
        (asknumber
         (prompt "Wie alt sind Sie? (nur Zahlen von 3 bis 100 zulässig)")
         (help @asknumber-help)
         (range 3 100)
         (default 20)
        )
       )
       (set #ergebnis
        (askoptions
         (prompt "Zutreffendes bitte ankreuzen.")
         (help @askoptions-help)
         (choices "Ich mag den AmZeiger."
                  "Ich hab die Nase voll!"
                  "Elvis ist tot."
                  "Bei mir darf jeder machen was ich will."
         )
         (default %1011)
        )
       )
       (
        (set #diskname
         (askstring
          (prompt "Bitte geben Sie den exakten Namen einer Diskette an, "
                  "die sie zur Hand haben. (Ohne ':'!)")
          (help @askstring-help)
          (default "Workbench3.0")
         )
        )
        (askdisk
         (prompt "Bitte legen Sie die Diskette " #diskname " ein.")
         (help @askdisk-help)
         (dest #diskname)
        )
        (set #ergebnis "Diskette erfolgreich eingelegt.")
       )
      )
      (message "Das Ergebnis der von Ihnen gewählten Aktion ist:\n" #ergebnis)
      (set #i
       (askbool
        (prompt "Möchten Sie noch einen Durchlauf starten?")
        (help @askbool-help)
        (choices "Ja" "Nein")
        (default 1)
       )
      )
     )
    )

In diesem Beispiel stecken natürlich einige neue Kommandos, weswegen es etwas verwirren mag, aber wenn wir es etwas unter die Lupe nehmen, dürfte die Funktionsweise schnell klar werden.

Zunächst einmal erinnern wir uns wieder an unsere Control-Statements und betrachten einmal den Aufbau des Scripts. Wenn wir die uns noch unbekannten Blöcke einmal ignorieren, ergibt sich folgendes Schema:

    ;Voreinstellen der Schleifenbedingung
    (set #i 1)

    ;Schleifendefinition
    (while (= #i 1)

     ;alle Anweisungen innerhalb dieser Klammer gehören zur Schleife
     (

      ;Es wird eine Auswahl getroffen und ein Wert von 0-5 entsprechend
       dieser Wahl in der Variablen #auswahl abgelegt.
      (set #auswahl (askchoice ...))

      ;Mittels der (SELECT )-Anweisung wird die Variable #auswahl
       ausgewertet und in den entsprechenden Anweisungsblock verzweigt.
      (select #auswahl

       ;#auswahl=0
       (set #ergebnis (askdir ...))

       ;#auswahl=1
       (set #ergebnis (askfile ...))

       ;#auswahl=2
       (set #ergebnis (askstring ...))

       ;#auswahl=3
       (set #ergebnis (asknumber ...))

       ;#auswahl=4
       (set #ergebnis (askoptions ...))

       ;#auswahl=5
       (
        (set #diskname (askstring ...))        )
        (askdisk ...)
        (set #ergebnis "Diskette erfolgreich eingelegt.")
       )

      ;Ende der (SELECT )-Anweisung
      )

      ;Ausgabe des Ergebnisses
      (message "Das Ergebnis der von Ihnen gewählten Aktion ist:\n" #ergebnis)

      ;Hier wird die Schleifenbedingung #i (durch den User) neu gesetzt.
       Möchte er fortfahren, so wird #i=1, ansonsten #i=0 gesetzt.
      (set #i (askbool ...))

     ;Ende des Anweisungsblockes, der in der Schleife (mehrfach) abgearbeitet
      wird
     )

    ;Ende der (WHILE )-Anweisung
    )

Ich denke, daß die Funktionsweisen von (WHILE ) und (SELECT ) in diesem Beispiel nun deutlich geworden sein müßten.

Ebenso sieht man hier die Wirkung von Klammern in Bezug auf das Zusammenfassen von Kommandos zu Blöcken. Diese Klammern sind ein recht wichtiges Element bei der Installer-Programmierung und oft muß man erst einige Klammerfehler beseitigen, bevor der Installer ein Script akzeptiert und es so abarbeitet, wie man sich dies gedacht hat.

In der Bedingung für die (WHILE )-Schleife wurde ein bisher noch nicht genauer behandeltes Element verwendet, der Operator (= ). Wie schon erwähnt, behandelt der Installer Operatoren nicht anders als Funktionen, daher auch diese etwas ungewöhnliche Schreibweise. Die Operatoren werden im weiteren Verlauf daher auch nicht näher behandelt, ihre Funktionsweise dürfte intuitiv verständlich sein. Sie haben alle die Schablone

(Operator <wert> [<wert> ...]),

wobei wert natürlich auch eine Variable sein kann. Der Installer kennt die Operatoren (= ), (> ), (>= ), (<= ), (< ), (<> ); (+ ), (- ), (* ), (/ ); (AND ), (OR ), (XOR ), (NOT ), wobei für (AND ), (OR ) und (XOR ) die Angabe von mehr als zwei Werten erlaubt ist. Die Bedeutung dieser Operatoren sollte bekannt sein.

Etwas Verwirrung mögen vielleicht noch die Zeilen (set #ergebnis (askdir ...)) etc. stiften, wenn man sie mit der Schablone für das (SET )-Statement vergleicht. Offenbar ersetzt hier (askdir ...) die Angabe eines Wertes, der der Variablen zugeordnet wird. Tatsächlich ermöglicht der Installer es, Statements und Funktionen, die Werte zurückgeben, wie Variablen bzw. eben Werte selbst zu behandeln. Dies ist zugleich auch die Art und Weise, in der diese Rückgabewerte an Variablen übergeben werden.

Achtung: Dies gilt nicht für die Anwendung innerhalb von Parametern. Hier dürfen nur Variablen oder direkt Werte angegeben werden.

Die Funktionsweise der Funktionen zur Interaktion mit dem User geht aus der jeweiligen Kommandobeschreibung und dem Beispiel hervor. Es ist darauf zu achten, daß der User immer gut informiert ist, was das Script gerade von ihm wissen möchte. Außerdem empfiehlt es sich, ein wenig mit den Parametern herumzuexperimentieren, da diese bei umfangreicheren Scripts eine tragende Rolle spielen können.


Prev Inhaltsverzeichnis Next
©`98 Der AmZeiger