|
Kleines Rexx KompendiumWegweiser für den Gebrauch von ScriptenDer Anstoß zu diesem Thema kam aus dem Kölner Userclub. Dort wurde über einen Schwenk der Zielsetzung des Userclubs in Richtung LINUX nachgedacht. Protest ! Dann kann ich alle meine kleinen Rexx Helferlein wegwerfen. Ist es denn nicht gerade die hohe Integration der Rexx Scriptsprache mit dem Betriebssystems, wodurch für uns OS2ler dieses Betriebssystem unersetzbar wird ? Es gibt zwar Rexx für Win* und auch für Linux, aber sicherlich nicht sooo mächtig ! Und wer will sich schon mit dem Win$Murx und den zwei unterschiedlichen Zeichencodes zwischen der Kommandozeile und der GUI-Ebene herum ärgern ? Für mich ist Rexx zu einem unverzichtbaren Tool für die Datensicherung, für FTP-Kommandos, zur Aufbereitung kleinerer Texte für Staroffice, zum Hinterlegen wichtiger Zusatzinformationen zu Dateien und nicht zuletzt zur Kontrolle der Daten auf meinem System geworden. Selbstverständlich habe ich sofort zugesagt so eine Abhandlung zusammenzustellen. Ich wußte damals nur nicht, auf welches Wissen ich bei den Team Kollegen aufbauen kann. Ich rechnete damit, daß das Wissen über Rexx sehr unterschiedlich ist, darum entschloß ich mich NICHT meine kleinen Helferlein vorzustellen, sondern einen Überblick über die Rexxmöglichkeiten zu liefern und allgemeine Informationen mit speziellen kleinen Beispiele bereit zu stellen. Eigentlich sollte der Titel 'Wie ich lernte Rexx zu lieben' lauten, doch der Titel war bereits von einem Voice Artikel besetzt und so entschloß ich mich diesen Titel zu wählen. Wenn Ihr (oder Sie) nun die vorliegenden Unterlagen gelesen habt (haben), bin ich ganz sicher, daß auch Ihr Eure Arbeisoberfläche nach Belieben gestalten könnt. Für die Nicht-OS2ler bin ich ganz sicher, daß Ihnen klarer geworden ist, welche Flexibilität das Betriebssystem zur Verfügung stellt. Es wäre schade, wenn es aus mangelndem Interesse kaputt geht, vergessen wir nicht, in einem Microsoft BS werden wir NIE so viele Feinheiten und Möglichkeiten zur Konfiguration vorfinden (!) und dennoch ist es so einfach ! Alle wichtigsten Scripte sind hier als Links erreichbar. Laden Sie diese Files auf Ihr System und starten Sie die. Wenn Sie jeden Ausführungsschritt verfolgen möchten, fügen Sie bitte noch den Befehl TRACE ?r als zweite Zeile in die Datei ein. This document contains information on how to use REXX with Classic REXX. There are a lot of very useful functions also in Object REXX. See New REXXUTIL functions for an overview that will come later.
Rexx, was ist das?REXX verwendet innerhalb einer einfachen Struktur einige leistungsstarke, vielseitig einsetzbare Funktionen, kennt die üblichen arithmetischen Funktionen und kann OS/2 Befehle ausführen. Bereits vorhandene Stapeldateien können mit wenigen Änderungen in Rexx Prozeduren umgewandelt werden. Sie werden somit auch leistungsfähiger. Die Hauptanwendung von Rexx war sicherlich die Konfiguration der Präsentationsoberfläche und die Pflege anvertrauter Systeme mit möglichst wenig Aufwand, aber in der Zwischenzeit kann Rexx wesentlich mehr ! Lest mal, was IBM dazu schreibt oder schlagt diese Seite view rexx "Die OS/2 Prozedursprache 2/REXX" auf (kopiert einfach den Befehl und setzt ihn in einem OS/2 Fenster ab). Ergänzen möchte ich diese IBM-Informationen mit dem Hinweis, daß man die in Rexx geschriebenen Kommandos an jeder Stelle einen TRACE einstreuen und zur Laufzeit auch wieder abschalten kann. Genau das macht die Überwachung und Kontrolle dieser Scriptsprache so leicht. Der Vergleich REXX mit Basic. Irgendwo habe ich einen Artikel gesehen, in dem Rexx mit Basic verglichen wurde. Diesen Ansatz halte ich für völlig verfehlt, denn die Unterschiede sind dermaßen gravierend, daß man nicht von gleichwertigen Möglichkeiten reden kann. Rexx ist wesentlich mächtiger. Basic ist optimiert für das Anbinden von Geräten. Visual Basic ist ein Programm zur Gestaltung einer Bedienungsoberfläche, in beiden Tools müssen Systemkommandos, wenn man diese braucht, als einzelne Shell Aufrufe ausgewiesen. Mehr geht nicht ! Rexx dagegen ist kein selbständiges Programm, sondern es besteht, je nach Verwendungszweck, aus unterschiedlichen DLL-Modulen. Will man also Rexx nutzen, so muß ein Programm gewählt werden, das den Rexx Interpreter aktiviert. Außerdem müssen die Rexx Anweisungen in einer Datei vorliegen, der Datei Typ wird dabei vom rufenden Programm bestimmt (insofern sind die in Abschnitt 1 gemachten Angaben der IBM unvollständig) !
Resume: Das ist nicht dasselbe wie bei Basic. Bei Basic werden Shell Aufrufe einzeln ausgewiesen, bei Rexx bleibt die Kontrolle vollständig in Rexx. Es können daher Schleifen programmiert werden und innerhalb der Schleifen einzelne Informationen ans übergeordnete Programm übergeben bzw. aus diesem abgerufen werden ! Außerdem habe ich nirgends eine so umfangreiche Programmbibliothek gefunden wie für Rexx ! Die hier vorgestellte Abhandlung wird das überzeugend belegen ! Zum Funktionsumfang: Verwenden wir Rexx in einer *.cmd Datei, so haben wir die Funktionalität beider Tools, die von Rexx und die des CMD.exe. Dort gibt es ca. 100 Systemkommandos. Rexx kennt ca. 300 Anweisungen. Nicht gezählt alle möglichen Varianten, die mit Hilfe der Parameter gesteuert werden können. Auch ich kann diese Menge nicht vollständig im Kopf haben. Aber man muß wissen, wo man möglichst schnell etwas nachschlagen kann, dazu soll dieser Vortrag dienen. Prüfen einzelner Sourcebereiche: Auch das Programm RexxTry möchte ich an dieser Stelle erwähnen. Mit diesem Prg. lassen sich einzelne Statementfolgen sehr einfach testen, bevor man sie einbaut ! Auch so etwas kennt Basic nicht !
The functions, we needIch habe früher mal auf einem IBM Prozeßrechner gearbeitet, vielleicht kommt es daher, daß das erste was ich suchte, so ein Befehl wie "Suspend" war. Mit diesem Befehl kann man eine Aktion verzögert starten ohne die CPU für für andere Prozesse mit unnötigen Befehlen zu blockieren. Der richtige Tip kam von Carsten M. Er schrieb mir damals "Schau mal unter SysSleep nach" ! Das erste Rexx Programm Unter einem solchen Schlagwort hätte ich das Gesuchte nie vermutet. - Das reichte, damit hatte ich meinen Zeitgeber fertig und keine Hausarbeit brannte mehr an, während ich am PC die Zeit vertrödelte. Das ist nicht zum Lachen, manche meiner WinKaos Freunde versuchen so etwas immer noch mit Rechenschleife in einer Stapeldatei (arme CPU) ! Testen wir den Befehl "SYSSLEEP". Einfach eine CMD Datei mit folgendem Inhalt anlegen und starten, aber Achtung, die Kommentarkennung /* */ muß in Zeile 1 mit Spalte 1 beginnen, sonst wird kein Rexx daraus ! Die Systemfunktionen sind in der dynamische Link-Bibliothek RexxUtil hinterlegt und werden für Ein- und Ausgaben, für Systembefehle und zum Bearbeiten der OS/2 INI-Dateien benötigt. Ist dieses Util bereits im System resistent, können alle OS/2 Sitzungen darauf zugreifen. Ergänzen wir diese beiden Zeilen. Das sieht dann so aus: rc = SysSleep(5*60); /* in Einheiten Sekunden */ CMDBefehl = "call C:\MMOS2\PLAY.CMD FILE=C:\MMOS2\SOUNDS\BOING.WAV" CMDBefehl exit; Ich habe bewußt keine weiteren Erklärungen dazu abgegeben. Beim Probieren müßte eigentlich klar sein, was da abläuft ! Bevor Ihr weiterlest, lest diesen Nachtrag. Eine ebenfalls nützliche SysSleep Anwendung wäre, einen Diavortrag bei gesperrter Tastatur zu starten ohne daß diese Sperre sichtbar ist. Folgende Schritte sind dazu notwendig:
Ein weiteres Beispiel für die SysSleep Funktion wäre der Bau eines Chronometers. So ein Chron war mein zweites Rexx Programm. Es ist aus einem ähnlichen Grund entstanden. Dieser Chronometer wird bei mir im Systemstart als Hintergrundprozeß eingebunden. Das hat noch einen weiteren Vorteil. Es sind dann auch alle notwendigen DLL-Module im System eingebunden. Dieser Link zeigt das Beispiel Pgr. Chron (Kopieren, die Zeilennummerierung entfernen, starten, läuft !)
Rexx InternaHalt ! Nach diesem Ausflug aber erst einmal zurück zu den Grundlagen. Rexx kennt nur Strings. Jede Variable oder Konstante ist im Grunde genommen nur eine Zeichenkette. Erst zur Ausführungszeit wird geprüft, welchen Datentyp der Inhalt diese Zeichenketten hat. Das ist auch der Grund, warum manches viel einfacher funktioniert als bei Basic. Wir haben nun einige Rexx Anweisungen kennen gelernt, doch damit diejenigen, die Rexx nicht kennen, nicht aufgeben, seien hier ein paar wichtige Erklärungen zur Einführung nachgereicht. Schaut mal in diesen Link: Anweisungen. Arbeiten mit Dateien Ich habe es immer als hilfreich empfunden, wenn ein Programmgerüst griffbereit vorliegt. Das will ich hier mit diesem ->Beispiel\Muster.cmd<- Musterscript<- anbieten. Es ist alles dabei was benötigt wird: Laden der CMD Aufrufparameter, Handhabung von Parametern bei Routinen, Öffnen einer Datei, Rewind, Lesen und Schreiben von Daten. Arrays Übrigens, auch Arrays sind in Rexx möglich. Viele Prozeduren geben als Ergebnis ein Array zurück, dabei werden die einzelnen Elemente einfach durchnummeriert. Eine solche Variable wird als "STEM."-Variable bezeichnet. Formal besteht eine solche Variable aus einem Namen mit einem Punkt und einer anschließenden Ziffern. Beispiel:
Rechnen mit RexxEinfaches Rechnen: OS/2 stellt für den Test von Rexx Anweisungen das, selbst in Rexx geschriebene, Programm ->Beispiel\RexxTry.html<- RexxTry<- zur Verfügung. Prüfen wir mal, ob dieses Prg. als Taschenrechner brauchbar ist. Dazu bitte ich Euch über folgende Gegebenheit nachdenken: Es kommt nicht nur in meinem Umkreis vor, daß Kollegen sich den WIN*-Taschenrechner holen, diverse Zahlenkolonnen eintippen und dann das Ganze wiederholen müssen, um ganz sicher zu gehen, daß kein Tipfehler vorliegt. Nö, das ist kein Witz, das ist Tatsache ! Ich kann da nur Kopfschütteln ! Zu Hause nutze ich für solche Dinge immer Rexx. Mit dem Programm RexxTry kann ich Eingaben und Ergebnisse immer gleichzeitig betrachten evtl. falsche Eingaben direkt ausbessern. Zurück zu Rexx, schlagt in der Rexx Hilfe nach unter "Variablen und arithmetische Funktionen" und, wenn es um logische Operatoren handelt, auch hier Operatoren. Rexx kennt die Regel Punktrechnung geht vor Strichrechnung und kennt auch die Klammerregel: Ist also bestens als Taschenrechner geeignet. Also nehmen wir den CMD und rufen RexxTry mit dem Befehl "say" auf (jeweils als ein einzeiliges Kommando!). Anschließend können wir ein paar Werte korrigieren und erneut rechnen: Hinweis Was unter dem klassischen Rexx im RexxTry als Zeilenkommando nicht geht, ist die Bestimmung des Divisionsrestes (15 // 10) bzw. das Abschneiden der Nachkommastellen (15 % 10). Das aber ist eine Folge dessen, daß einer Rexx Script Datei für solche Fälle nicht der volle String weitergereicht wird. Will man obiges testen, muß man RexxTry ohne Parameter aufrufen oder solche Rechnungen innerhalb einer *.cmd Datei definieren. Im ORexx dagegen, wurde mir berichtet, sind diese Probleme behoben. Das Problem mit der Parameterübergabe wird nochmals weiter unten im Kapitel Erweiterte Datei Attribute behandelt. Schleifen Selbstverständlich kann jede Scriptsprache Schleifen bearbeiten. Auch unter einem einzeiligen RexxTry Aufruf ist das möglich. Die einzelnen Terms einer Anweisungen müssen zu diesem Zweck jeweils mit einem SEMI getrennt werden. Vielleicht sollte man sich dann doch generell das Semikolon am Ende einer jeden Rexx Anweisung angewöhnen. Hier ein Schleifenbeispiel für das kleine "Ein mal 8":
Ja, auch die gehen, sofern die DLL MathLoadFuncs im System eingebunden ist. Am besten Ihr baut auch gleich diese DLL in die o.g. Chron Prozedur ein. Diese RxMathFn.DLL ist leider nicht im Standardpaket Warp 4 enthalten. Sie kann aber kostenlos bei der IBM unter dem Schlagwort Employee Written Software Programs geholt werden.
Taschenrechner + hohe Rechengenauigkeit Zu diesem Thema bekam ich von Kollegen Peter aus Dänemark ein Beispiel zugeschickt: Die Zahl 35 habe ich hier gewählt, um das im Ergebnis deutlicher darzustellen. Mit numeric digits wird die Rechengenauigkeit festgelegt, arg läd das Argument, mit interpret kann extern definierte Anweisungen ausführen. Ich habe beim dritten Term des Statements auch zuerst gestutzt. Es wird klarer, wenn man man das obige Stm so interpretiert: interpret "say " || Param; Für alle, die so wie ich auch stutzen: Say ist in diesem Fall eine mit "SAY" vorbelegte Variable, die zum Interpretzeitpunkt als Rexx Schlüsselwort eingesetzt wird. Evtl ist folgendes leichter verständlich: Ausdruck = "205/79"; Aktion = "Erg ="; interpret Aktion Ausdruck; Say Erg; Die, in der Variable Aktion definierte, Zeichenkette Erg = wird in der Rexxfunktion Interpret als eine Anweisung erkannt ! Gleiches gilt auch für andere Rexx Funktionen und OS/2 Kommandos ! So nun können wir obiges Argument "Param" einsetzen. Daraus wird dann: numeric digits 35; arg Param; Aktion = "Say"; interpret Akion Param; exit; Ich finde das Statement von Peter herrlich kompakt, meine Schreibart ist vergleichsweise stupid. Rekursionen Bei Rekursionen rechnet man gerne bis zur Null-Differenz. Numeric fuzz hilft dabei, es reduziert den Wert von DIGITS für einen Vergleich. Die Zahlen, die miteinander verglichen werden sollen, werden mit einer Genauigkeit von DIGITS minus FUZZ Ziffern voneinander subtrahiert. Das Ergebnis wird dann mit 0 verglichen. Nutzen wir diese Funktion bei der Berechnung der Wurzel von 2.00 mit einer Genauigkeit von 35 (!) Stellen: Der Wurzelwert beträgt 1.414213562373095048801688724209698079 Ich weiß nicht, wo die Grenze für numeric digits liegt. Ich habe numeric digits bis zu einem Wert von 200 gesteigert, weitere Wurzel-Experimente wurden mir dann zu langweilig, ich hatte keine Lust mehr. Überhaupt, bei rekursieven Funktionen kann man die Genauigkeit ins Unermeßliche steigern.
Ermitteln der Größe von OrdnernReden wir mal in diesem Abschnitt nicht von Ordnern sondern von Directories, das macht die Sache einfacher. Immer wieder mal begegnet einem meiner Bekannten das Problem, daß, aus welchen Gründen auch immer, die Festplatte voll ist. Und dann wird nach einem Tool gesucht, daß die Größe solcher Direktories ermittelt. Warum eigentlich wenn man OS2 hat ? Das erinnert mich an meine Vorgesetzten, die da immer behaupten, für OS2 gibt es keine Programme. FALSCH, oder hat einer der Vorgesetzten mal behauptet, auch er sei phantasievoll und kanns deshalb behaupten ? OS2 hat alles, was man so braucht an Bord. Einbißchen Phantasie braucht man allerdings auch. Das einzige Problem besteht doch, daß man die Summe aller Datein bilden muß, die mit dem Dir-Befehl in der 3. Spalte angezeigt werden ! Außerdem müssen dann noch die Zeilen ignoriert werden, die das <DIR> enthalten. Beim Testen habe ich allerdings noch feststellen müssen, daß, bei Verwendung des 4OS2, außerdem der Punkt in den File-Größen stört, der die tausender Markierung setzt (der CMD kennt den Tausenderpunkt nicht). Wenn man das auch noch berücksichtigt, wird das Ganze mit einem 8 zeiligen Script (die Rexx Initialisierung nicht mit gezählt) erledigt: Das was's schon, das ist doch die Stärke von Rexx. Und so sieht dann die Anwendung aus: Ich habe es somit bereits angedeutet: Wir brauchen eine Unabhängigkeit vom Command Interpreter ! Rexx stellt die Möglichkeit zur Verfügung das DIR-Kommando zu ersetzen. Das Script wurde noch etwas designt, darum will ich es hier unter dem Namen RexxSize
Rexx & TabellenkalkulationRexx fremde Anweisungen werden während der Verarbeitung dem übergeordneten Programm übergeben, wo ist hier der Nutzen ? Die Firma Sundial Systems Corporation hat Rexx vollständig in ihre Tabellenkalkulationsprogramm MESA/2 integriert. Hierzu stellt Sundial eine DLL zur Verfügung. Integriert in ein Rexx Script, können dann Mesa/2 Tabellen vollständig gefüllt oder Ausgelesen werden, Rechenoperationen gestartet und Ergebnisse gedruckt werden. In einer OS/2 CMD-Datei sieht das dann so aus: do i=1 to 10 Wert = i*8; /* das "Ein mal 8" */ SeiteSpalteZeile = "[A]B" || i; /* Seite A, Z 1 ..10 */ rc = mesa2PUTC(Wert,SeiteSpalteZeile) /* Wert Spalte B */ rc = mesa2PUTC("" i "mal 8" ,"[A]A" || i) /* Wert Spalte A */ end; /* Summe bilden und dann gesamte Seite drucken */ Erg= mesa2CALCULATEFUNCTION("SUM(B1:B10)") rc = mesa2PUTC(Erg,"B12") rc = mesa2PUTC("Summe","A12") rc = mesa2PRINT("[A]") /* ist ja wohl sprechend */ exit; Aber auch der umgekehrte Weg geht. In Mesa/2 wird eine Seite bereit gestellt, in der ein Rexx Script hinterlegt werden kann (Achtung, die Mesa/2 Befehle haben hier eine etwas andere Syntax). Das Bild zeigt die Mesa/2 Script Seite. Ich kann das Produkt sehr empfehlen, bevor ich mich in der Dokumentation von Excel verlaufe, habe ich meist eine Rexx Lösung im Clippboard. Bitte jetzt nicht wieder eine solche Rexx Schnittstelle mit der Schnittstelle VBA und Excel vergleichen ! Einen solchen Vergleich habe ich bereits oben vollzogen ! Weiteres nur als INFO ! Es gibt leider nur wenige Programme, die ein Rexx Entry bereitstellen: PMMail (Blueprint Software Works) gehört dazu. Dort nutze ich die Rexx Schnittstelle, um Mails zu scannen und somit weiterzuleiten oder auszuwerten / zu vernichten. Eine gute Möglichkeit, einen automatischen Oparator bereit zu stellen. Ich habe 2004 entdeckt, daß die Webseite de.os2.org solches für die Bereitstellung der auf Hobbes neu eingegangenen Software nutzt !
Erweiterte Datei AttributeAuch hier erst mal eine Anekdote. Teamer Carsten hat einen Downloadmanager entwickelt und im Forum angeboten. Was der denn so kann, hatte ich nicht so richtig verstanden. Ich dachte immer, das PRG ist zur automatische Kontrolle und zum Wiederaufsetzen von Downloads gedacht. Nö, der Name ist nur unglücklich gewählt ! Immer wenn Carsten etwas auf die Festplatte speichert, geht ein Fenster auf, im dem er Schlagworte zur geholten Datei hinterlegen kann. Gute Idee, so findet man Dateien und Infos schnell wieder. Ich bearbeite solches seit 96 mit dem Describe Kommando vom 4OS2. Warum sollte ich mich da umstellen ? Dieses Describe nutze ich auch für andere Zwecke, z.B: zum Ablegen von Infos zu speziellen Directories. Mit dem 4OS2 Dir Befehl und der Option /i (Schlagwort Suche) lassen sich solche Dateien auch schnell wieder auffinden. Aber ich muß gestehen, daß manchmal alle Dateibeschreibungen selbstverschuldet verschwinden, verursacht durch ein manuelles "move" ganzer Directories, aber auch verursacht durch das Draw and Drop von Dateiobjekten. Das ist keine gute Integration mit dem Betriebssystem ! Unter NT lösen einige Kollegen dieses mit einem File Rename der Form AlterName, NeuerName {Schlagworte}. Doch damit ist das Problem eigentlich nicht erschlagen. Was ist dann zu tun, wenn andere Gesichtspunkte hinzukommen ? Noch ein Rename ? Eigentlich bräuchte man neben Schlagworten auch die gesamte Filehistorie ! ListEA.cmd OS/2 kann so etwas. Es kennt erweiterte File Attribute, genannt EA. Dort können Keyworte, Historie und sogar Binärdaten hinterlegt werden. Zuvor möchte ich jedoch aufzeigen, wie solche Informationen ausgelesen werden können. Dazu tragen wir mal einen ->Images\ExtAttrib1.jpg<- Kommentar<- mit Hilfe des Systems via Notizbuch: Lasche Datei, Dritte Seite ein. Jetzt schauen wir uns das mal mit diesem kleinem (!) Script an. ReadEAComments.cmd Bei der Betrachtung der Ausgaben mißfallen einige Sonderzeichen, diese gilt es heraus zu filtern. Schauen wir uns den Aufbau dieser Strings an. Das EA .comment ist vom String Typ EA_MVMT (Multi Value Multi Type). Ein Daten-Type, in dem mehrere Werte unterschiedlicher Typen, in einem String hinterlegt werden können. Gute Dokumentationen dazu findet Ihr in den Inf-Dateien von Tip&Tricks. Seht nach mit Hilfe von view rxtt33.INF "Extendet Attributs used by the WPS" Der Aufbau dieses EA ist: Datatype Codepage Anzahl_Eintrage Datatype1 Laenge1 Eintrag1 ... Datatype# Laenge# Eintrag# Mit diesem Wissen können wir nun auch das zweite Beispiel lesen. Es listet Files mit Comment-EA der aktuellen Directory an. Soll gezielt nach einem Begriff gesucht werden, so kann die Ausgabe mit Hilfe eines FIND Kommandos und dem Pipe-Operator gefiltert werden, probiert es mal. Aufrufbeispiel einer solchen Suche: ReadEAComments.cmd | find /i "Hura" Aha, Hier liegt die Datei -;) RexxUpdateEA.cmd Wir möchten aber solche EAs ablegen und nutzen können. Dazu kann ich ein drittes Beispiel ->Beispiel\RexxUpdateEA.cmd<- RexxUpdateEA<- anbieten. (In den Userkreisen habe ich dazu eine Warnung erhalten, die ich hiermit weitergeben möchte: Beim Schreiben von EAs ist zu berücksichtigen, daß Intel Prozessoren 32-Bitwerte im Little Endian Format speichern - d.h. mit vertauschten Bytes. Beispielweise "1234" als "3412". Das müßte überprüft werden. Bei mir läuft die Source auf einem Pentium 3 Prozessor). Aufrufbeispiele:
Autsch, da habe den Salat. Das Programm ist ein Teil aus dem nachfolgenden Script DescUebg.cmd. Fehler sind mir bis dato nicht bekannt. Jedoch ist mir beim Arbeiten mit RexxUpdateEA aufgefallen, daß Internet Link-Adressen nicht übernommen werden, wenn diese ein // enthalten, wie z.B. in ftp://ftp.software.ibm.com/ps/products. Gleiches Problem besteht, wenn Pipe-Operatoren im Kommentar verwendet werden. Das Problem kennen wir doch ! Das hatten wir schon bei der Bestimmung des Divisionsrestes ! Enthält der Aufrufparameter einer Rexx Script Datei die Zeichen // so wird nur eine Zeichenkette bis zum Auftreten von // weitergereicht. Das Problem tritt NICHT bei CMD-Dateien auf, die kein Rexx nutzen. Die einzigen mir bekannten Lösungen sind, solche Strings über Hilfsdateien oder Queues weiterzureichen oder mittels LineIN/CharIN abzufragen. Der Workaround Die Rexx Tip&Tricks Empfehlung lautet: Indirekter Aufruf des Rexx Programmes mittels eines Batch-Files. In diesem Batchfile wird eine Enviromentvariable mit Namen REXXParms stückweise zusammen gesetzt und anschließend das Rexxprogramm gerufen. So sähe der Batch-File aus: EAs und Programme Es gibt leider noch einen weiteren Wermutstropfen. Alle Dos-, alle mir bekannten Windows- und auch einige Nativ OS/2 Programme löschen die in Arbeit befindliche Originaldatei um diese dann direkt wieder neu anzulegen. Die EAs der Originaldatei sind dann weg. Also bitte nicht wundern, wenn ihr nach einer kleinen Korrektur eines Worddokumentes Eure EAs nicht mehr findet. An mir liegt es nicht ! desc.cmd Für mich kommt nur eine Lösung in Frage, die mehr als das bisherige kann:
Da das meiste bereits vom 4OS2 unterstützt wird, bot sich die Verwendung der dort verwendeten Hilfsdatei an. Im diesem Script ->Beispiel\desc.cmd<- desc.cmd<- wird das Describe Kommando aufgerufen, das die Informationen entgegen nimmt und das Ergebnis dann als EA unter ".Comment" weggepackt. Die EAs lassen sich jetzt sehr bequem von der Commandozeile aus editieren. Einfacher geht es wirklich nicht, allerdings muß das 4OS2 installiert sein ! Das 4OS2 ist freigegeben, es stehen also keine Gründe im Wege es sich herunterzuholen und zu installieren. Übrigens ist dieses Script ein Beleg, daß das vom 4OS2 aus aufgerufene Rexx Script die 4OS2 Kommandos und nicht die CMD-Kommandos verwendet. Unhandlich ? Für die 'mouse' Fetischisten ist das ganze in der Praxis sicherlich etwas unhandlich. Man befindet sich meisten in der falschen Arbeitsoberfläche in der GUI statt auf der Commad-Ebene oder umgekehrt. Um Comments zu pflegen oder Recherchen anzustoßen, müßte man dann die Arbeitsoberfläche wechseln können. Auch dieses kann unter OS/2 listig gelöst werden. Wie, das kann im nächsten Kapittel nachgelesen werden.
Arbeiten mit OrdnernOrdner öffnen.Stellen Sie sich vor, Sie haben sich mit der Command Interpreter tief ins System hinein gehangelt (z.B nach: C:\Arbeitsoberfläche\ Programme\ Developer Kit,^Java(TM)^Technology\ Beispiele^zur^Java-Programmierung und möchten nun mit einem Befehl dieses Directory als graphisch dargestellten Ordner in der GUI sehen. Mit diesem ->Beispiel\OpenFLDR.cmd<- Script<- haben wir so einen Befehl. Ich habe da gleich 4 OpenFldr Varianten eingebaut mit den Parametern. I (Öffnen Icon View), D (Detail View), T (Tree View) und A (Sicht als Tree und Icons) Auch hier zeigt sich die Überlegenheit der Tastatur gegenüber der 'mouse'. So schnell wie mit diesem Script kann man die Sicht auf Objekte in einem alternativen Format via 'mouse' nicht öffnen ! Fehlt uns noch das Gegenstück, das Starten der Kommandozeile für einen vorgegebenen Ordner. Öffnen einer CMD-Sicht des Ordners Hierzu gibt es zwei Varianten: Die Erste nutzt die eingebauten Systemfeatures, die zweite erreicht das gleiche über den Umweg Rexx. Doch zuerst die Nutzung der OS/2 Systemfeatures. Gefunden habe ich entsprechende Unterlagen in den eZime News, (hier das Original). Das ganze nun in vereinfachter Abänderung: Man ziehe aus dem Schablonenordner das "Programm" Objekt auf die Arbeitsoberfläche und trage in die drei Felder des sich öffnenden Notizbuches:
Jetzt muß dann das Kontexmenü "Öffnen" der "Lieblingordner" erweitert werden. Dazu öffne man das Notizbuch der jeweiligen Ordner, schlage den Tabulator "Menü, Seite 2" auf, klicke unter Verfügbare Menüs auf "~Öffnen" und ziehe das soeben erstellte Objekt "Command Sicht" in das Feld "Aktionen. Dann schließe man auch dieses Notizbuch. Ab sofort hat man im Kontexmenü dieses Ordners unter "Öffnen" einen weiteren Eintrag. Das war's. Möchte man stattdessen seinen Commander einbinden, so geht man genauso vor, nur daß stattdessen im Feld "Pfad und Dateiname" : eine Scriptdatei genannt wird. Probieren Sie es das mal, so müßte das Notizbuch aussehen und so das Kontexmenü des Ordners. Ordner Schließen Zu diesem Thema gehört auch ein Beispiel zum Schließen eines ->Beispiel\ClosFLDR.cmd<- Ordners<-. Dieses Beispiel schließt (falls der Ordner mehrfach geöffnet wurde, sogar alle) gleichnamigen Ordner. Auch hier ist die Überlegenheit der Kommandozeile gegenüber der 'mouse' deutlich: Es geht in einem solchen Fall einfach bequemer und schneller, vorausgesetzt der eigene Commandinterpreter hat eine "Filename Completion". Resume Damit haben wir alle Freiheiten, um aus einem geöffneten Ordner heraus, für diesen Ordner die Commandozeile zu starten, die EAs der Dateien dieses Ordners zu durchforsten und dann beliebig, ohne 'mouse' Aktion die Arbeitsoberfläche wieder freizuräumen.
Setzen der Assoziationen für ProgrammIch muß nachfolgendes, ohne weiteren Kommentar, einfach mal so zum Schmunzeln für Euch einfügen. Ohne diese Post wäre mir dieser Teil der Rexx-Hilfe nicht klar geworden - übersehen hatte ich in der zugehörigen Onlinehilfe den Begriff "vollständiger Dateiname".Hi Uwe, Jetzt bin ich auch mal zum Lesen gekommen. Sieht gut aus - vielen Dank für die Mühe! Erwähnenswert iust meiner Ansicht nach noch zur Funktion SysOpenObject. Mit dieser Funktion lassen sich nicht nur Objekte identifiziert über die ObjectId, sonder auch Dateiobjekte über Ihren Namen öffnen. z.B. benutzt Du ein externes OS/2 Kommando um ein Wavdatei abzuspielen: Zitat: CMDBefehl = "call C:\MMOS2\PLAY.CMD FILE=C:\MMOS2\SOUNDS\BOING.WAV" CMDBefehl Meiner Ansicht nach ist die elegantere Methode: file = 'C:\MMOS2\SOUNDS\BOING.WAV' rc=SysOpenObject(file, 0, 'TRUE') Damit nutzt Du die Assoziationen der WPS (diese müssen natürlich entsprechend gesetzt sein), und Du brauchst Dich nicht um das ausführende Programm kümmern. Letztlich läuft diese Routine dann auf jedem Rechner, und benötigt kein Setup. Damit können im Prinzip alle bekannten Dokumente, Ordner etc geöffnet werden. Gruß Frank Wumm, ins Schwarze getroffen. Das habe ich übersehen und auch nicht gewußt, obwohl das aus der Prozedurbeschreibung eindeutig hervorgeht. Dabei ist mir auch bewußt geworden, wie wichtig ein Absatz über das Setzen der WPS Assoziationen wäre. Danke Dir. Setzen der Assoziationen für Programm Wozu eigentlich ? Einfach nur deshalb, damit man mit dem Klick der Mouse auf ein Datenobjekt dieses öffnen lesen kann ? Meistens hat das bei mir nicht richtig funktioniert, außerdem navigiere ich und starte ich zu 95% Programme mit der Tastatur. Beispiel, ich nutze wegen der Rechtschreibkontrolle gerne für meine schwedischen Dokumente das schwedische StarOffice und für die übrigen Dokumente das deutsche StarOffice. Ein Doppelklick auf ein Objekt öffnet das Dokument mit dem falschen Programm. Auch mittels Programm AssoEdit ist dieses Problem nicht lösbar. Ich habe nun das mit den Zuordnungen bei der Registrierung nochmals durchgearbeitet. Vielleicht ist das Problem jetzt lösbar. Setzen der Assoziationen für Programm ... damit man mit einem "Mouseklick" auf ein Datenobj... Nein nicht nur deshalb, bleiben wir bei der Tastatur ! Manche Commandinterpreter können ebenfalls ein Datenobjekt einem Programm zuordnen ! Mit diesem Einschub will ich aufzeigen, wie wichtig Kenntnisse über Abläufe bei der Registrierung sind, um obige Probleme verstehen und lösen können. Ausnahmen erkennt man meistens erst im Nachherein.
Setzen der WPS AssoziationenAnmerkung In den nachfolgenden CMD-Dateien habe ich vorsichtshalber eine Bremse für unbeabsichtigtes Starten eingebaut und deshalb die einzelnen Optionen nicht als Parameter implementiert sondern im Programm selbst hinterlegt.Es soll hier das Zusammenwirken der Registrierung (OS2.INI) und der Erweiterten Attribute betrachtet werden, darum habe ich die Parameter der Funktionen SysDestroyObject, SysIni, SysCreateObject, SysGetEA, SysPutEA und SysOpenObject hier zusammengetragen. Objekt erstellen Die nachfolgende Skizze entspricht etwa der Source des ersten ->Beispiel\Registrieren1.cmd<- CMD-Files<-. Hier wird das Programm ARJ als Objekt registriert. Die Zeile 02 löscht zuvor evtl vorhandene Einträge in der OS2.INI, soweit diese registriert sind. Weitere Einträge müssen evtl manuell (Zeile 03 und 04) gelöscht werden. Danach (Zeile 12) wird das Objekt neu registriert. Die zugeordneten Assozationen und Aufrufparameter (Zeile 11) werden dabei in die OS2.INI eingetragen. Prüfen kann man das sehr schön mit diesem ->Beispiel\ListUserIni.cmd<- Script<-. Hinweis zu Optionen: Eigentlich sollten alle Felder, die man im Notizbuch findet auch unter Rexx steuerbar sein, ich habe jedoch die notwendigen Schlüsselworte nicht gefunden. Bei Filterangaben wird zwischen großen und kleinen Buchstaben unterschieden. Obwohl unterschiedliche Schreibweisen im zugehörigem Objekt nicht angezeigt werden, sind diese existent. Ergebnis. Jetzt haben wir die folgende Situation: In der Config.sys braucht für ein Objekt keine PATH-Angabe definiert werden. Bei allen neuerstellten *.ARJ Files funktioniert SysOpenObject (natürlich auch der doppelte Klick auf das Objekt). Bei allen älteren Files nicht. Obwohl das richtige Objekt im Notizbuch unter Open vorhanden ist, geht bei diesen Files nur das Notizbuch auf. Leider ändert sich dieses Verhalten auch nicht, wenn - über einen zweiten Datentyp - eine zweite Open Möglichkeit hinkommt. Programm und Datenfile Man kann aber auch ohne ein Objekt auskommen und stattdessen die notwendigen Eigenschaften im Notizbuch des Programms bzw der Datenfiles setzen. Aber - wie denn setze ich mit Rexx Parameter, Sitzungsdaten und Zuordnung in den .Classinfo der EAs ? Das ist mir leider derzeit verschlossen und ohne Einsatz von C sehe ich da kein Vorwärtskommen. Es bleibt an dieser Stelle leider nur die Handarbeit. Naja, vielleicht sind es ja nur einzelne Programme, dennoch ist das für mich sehr unbefriedigend. Bei den Datenfiles ist es wieder etwas leichter. Mit dem Programm Registrieren3 kann ein weiterer Associations-Eintrag nachgerüstet bzw an Stelle 1 der Openauswahl gesetzt werden, dieses ist also eine feine Möglichkeit die Festplatte nach speziellen Kennungen wie å oder Å zu scannen und den Datentyp für die gefundenen *.sdw Dokumente auf das schwedische Staroffice zu setzen, jedoch ... Ergebnis. Bei allen neuerstellten Files funktioniert auch hier das SysOpenObject. Bei allen älteren Files nicht, obwohl das richtige Objekt im Notizbuch unter Open vorhanden ist. Beim Test ist mir allerdings aufgefallen, daß neue Files nicht immer mit dem richtigen Typ versehen werden (?) !
Eigene Klickstartleistenochmals SysCreateObjectBeim Aufbereiten der Script-Beispiele mußte ich feststellen, daß die Klickstartleiste, besonders, wenn man diese nach eigenen Bedürfnissen zusammenstellt, auch ihren Charme hat. Allerdings muß man auf die Kommandozeile und etwas Rexx anwenden. Übrigens, auch ein Beleg, daß die Microsoft Fan Gemeinde da hoffnungslos überfordert ist, die sehen einfach nicht, was für ein steifes und inflexibles System sie bevorzugen. Zurück zu eigener zusätzlichen Klickstartleiste. Mit diesen wenigen Scriptzeilen hat man so etwas: (*1) rc=SysCreateObject(Klasse,title,Ziel,Objekte || Optionen,"R"); if RC <> 1 then say "Oops, something went wrong!" rc=SysOpenObject(curObjectID,"DEFAULT",1) Wirklich interessant wird die Klickstartleiste erst, wenn man die einzelnen Fächer erweitert. Wichtig sind dabei allerdings zwei Dinge:
Anmerkung zum Script CreateObjekt: Die anzulegenden Objekte benötigen einen Ordner als Heimathafen. Als Ziel wurde C:\Arbeitsoberfläche\System\Objekte gewählt. Dieser Zielordner muß natürlich ebenfalls angelegt werden (nicht vorhanden im Script). Auch das Bootlaufwerk (im Beispiel "C:") müßte angepaßt werden. Dazu liefert ORexx den nötigen Befehl "Drive = SysBootDrive()". Diese Feinheit könnt ihr nun selbst einarbeiten. _(*1)_ Leider mußten einige Zeilen in der HTML Darstellung geteilt werden, da diese Sourcen über die zulässigen Zeilenbreite hinaus gehen. Die richtige Darstellung steht als Link daneben.
Applikationen einrichtennochmals SysCreateObject, Details dazuFür die Kollegen, die eine Applikation mit einer eigenen Installationsroutine installieren möchten, sei hier ein Beispiele zusammen gestellt. - Zu aller erst muß abgewogen werden, was man mit so einem Script erreichen will, ob man sich für einen CMD Befehl "MKDIR \Arbeitsoberfläche\MyFolder" und "COPY MyFile to .... " entscheidet oder ob man lieber mit Objekten arbeitet. Arbeiten wir mit Objekten, so können wir uns zwischen "CreateObject" und "CreateShadow" entscheiden. Im Beispiel entscheide ich mich für ein CreateObject, es ist mächtiger. Weiter ist zu entscheiden: a) Was wollen wir anlegen (welchen Objekt-Typ) b) Unter welchem Schlagwort soll es erscheinen (Title) c) Wohin wollen wir das neue Objekt installieren (Ziel). d) Mit welchen Bedingungen wollen wir das knüpfen (Optionen) und Dazu ein paar Schlüsselworte: anlegbare Objekte sind ::= "WPLaunchPad", "WPProgram", "WPFolder". Ziele können sein ::= Die WPS, ID = "<WP_DESKTOP>;" ObjektID eines zuvor angelegten Ordners, Beispiel-ID "<MyObjectID>;" oder ein Verzeichnis, z.B: "Directory()" Optionen sind ::= "OBJECTID=<XXXXXX>;", "ALWAYSSORT=NO;", "NODELETE=YES;", "NOMOVE=YES;", "NORENAME=YES;", "NOTVISIBLE=YES;", "PROGTYPE=PM;", "OPEN=TREE;", "OPEN DETAILS;", "OPEN ICON;", "ICONFILE=<XXXXXX.ICO>;", "EXENAME=MyProgram.exe;PARAMETERS=<XXXXXX>;", "ASSOCFILTER=*.ZIP,*.JAR,*.RAR,*.ARJ,*.LZH,*.*GZ,*.WPI;" "ASSOCTYPE=ZIP File;" "SHOWALLINTREEVIEW=YES;" "STARTUPDIR=" || Directory() || ";" Als SysCreateObject Aktion sind zugelassen ::= "U" (Update) bzw. "R" (Replace) Wenn die eigenen Vorstellungen festgelegt wurden, kann es losgehen. Mit Hilfe der beiden nachfolgenden Routinen sollte das Gewünschte einstellbar sein. Wenns funktioniert steht Result auf TRUE (Wert = 1).
Damit 's auch funktioniert, sind auf zwei Dinge zu achten: 1. Die einzelnen Teilstrings zu den Optionen müssen mit einem ; enden 2. Die übrigen Parameter dürfen nicht mit ; enden.
HTML DokumenteDieses Dokument wurde mit dem Systemeditor e.exe erstellt. Aus folgendem einfachen Grund: Er ist im Startverhalten der schnellste, läßt sich separat mit der Hintergrundfarbe auf schwarz einstellen, ist somit augenschonend, erzeugt eine, mit jedem anderen Programm verarbeitbare, Datei und verschwindet, wie früher bei den Großrechnern gewohnt, mit der Taste F3, erspart mir somit den Zweifingergriff "alt & F4". Alles andere ist ausreichend.Die Umsetzung nach HTML mache ich mit keinem Wordprogramm, das ist mit zu aufwendig ! Da kommt wieder Rexx zum Einsatz. Zur Historie: Ich habe lange mit dem Druck- und Dokumentationsfacility DCF der IBM gearbeitet: Mit diesem Facility schriebt man seinen Text in einem SPF Editor herunter, streut ein paar Formatbefehle ein und hatte damit ganz schnell ein optisch sauberes Druckbild. Die Formatbefehle sind sehr prägnant: ,lz (für Leerzeile) ,a (für Absatz) ,aufz (für das Einleiten einer Tabelle) und andere mehr. Alle diese Befehle mußten, in Spalte 1 der jeweiligen Zeile beginnen, ansonsten wurden sie ignoriert. Feine Idee, denn ein Komma als erstes Zeichen einer Zeile kann es nicht geben. Mit wenigen Formatierungen war ein Dokument ganz schnell gestaltet oder auch wieder umgestaltet oder man änderte einfach die Programmparameter. Genau das ist die Vorgehensweise in dem Script. Das kleine RexxPrg ersetzt diese einfachen Formatbefehle in HTML 'Tags'. Abhängig vom HTML Kopf wird die Seite zweispaltig oder einspaltig aufgebaut. Referenzen werden automatisch generiert, wenn ein ,ü (für Überschrift) auftaucht. Änderungen für ein HTML Format gehen auch schneller, ich ändere oder erweitere einfach einpaar HTML Befehle im Script. Ich brauche dazu kein HTML auswendig lernen, einfach im Script hinterlegt und schon wieder vergessen, Rexx macht's für mich und dem DCF sei ein nachträgliches Dankeschön gewiß ! Zumindest können so Verse und Prosa und Programm-Dokumente sehr viel einfacher heruntergeschrieben und als HTML aufbereitet werden als mit den allgemein bekannten Word Werkzeugen. Zum Testen nehmt mal den kleinen Ausschnitt dieses Dokumentes und unterwerft es diesem 2Html Script, einmal mit und einmal ohne HTML-Kopfdaten.
In eigener SacheTack ska du harIch habe auf meinem Rechner 'nur' das normale Classic Rexx installiert. Überrascht war ich allerdings, als ich beim Zusammenstellen dieser Unterlagen feststellen mußte, daß ich, um den vorgestellten Scripten den letzten Schliff zu geben, das ORexx benötige. Einige Hinweise in diesem Dokument zielen bereits darauf hin. Insofern war diese kleine Zusammenstellung sehr lehrreich für mich. Als nächstes wird ORexx bei mir istalliert. Ein paar Zusagen: die nachstehenden Themen werden folgen. Sie alle sollten ursprünglich noch in dieses Dokument. Es braucht jedoch noch eine Weile das notwendige Wissen präsentieren zu können. Was noch fehlt und derzeit auf meiner Liste steht, sind:
Downloads Ich wurde angesprochen, dieses Dokument in gepackter Form bereitzustellen. Zum Teil haben die einzelnen Files EAs, ich habe mich auch deshalb für ein ARJ Archive entschlossen. Dieses Dokument sollte mit folgendem Kommando entpackt werden.
... kritische Gedanken Es sind mir zwei Dokumente aufgefallen, die kritisch die in die Zukunft sehen: ->http://heise.de/newsticker/data/hps-02.04.03-000/<- Heise<-: MS Office: von Größe S bis XXL und ->http://aaxnet.com/editor/edit029.html<- Automation Access<-: 2003 and Beyond. Das sieht nicht gerade rosig aus. Da sollte man kritische Fragen stellen. Einige Fragen an unsere Großindustrie habe ich hier aufgelistet: Warum opfert Ihr Eure Rechnenzentrum, in denen das, über viele Jahre gesammelte, Wissen zentral abrufbar war, zugunsten einer PC Landschaft, bei der jetzt diese Daten, abgelegt in unterschiedlichsten und individuell aufgebauten Archiven, nur noch vor Ort zur Verfügung stehen. Warum vertraut Ihr, aus den Vorstandsetagen der Industrie, einem mehrerer illegaler Geschäftspraktiken überführten Geschäftsmann und unterstützt mit eurer Softwareausstattung ausgerechnet diesen ? Er wird ganz sicher, aus Angst unterzugehen, diese Praktiken weiter fortsetzen ! Insofern möchte ich dem Teil der Banken danken, die sich 2000 entschieden haben OS/2 weiterhin einzusetzen und somit IBM in die Pflicht nahmen dieses feine System via Conveniece Vertrag weiterhin zu Pflegen. Hier ist Solidarität gefordert. Ich schätze, daß alleine für die MS$ Software jährlich ca. 100 Mio Euro in die USA fließen, die zur Finanzierung heimischer Arbeitsplätze benötigt würden. Ich kann mir gut vorstellen, daß es eine Herausforderung und eine reizvolle Aufgabe wäre, Microsoft wieder zurück zu drängen. Einen enormen Motivationsschub auf die Mitarbeiter wäre das alle Mal ! Updates 4. Mai 2003 So einpaar Dinge hatte ich übersehen oder derzeit nicht gewußt. a) Neue Datei Desc.cmd, die Source vom Call RexxUpdateEA wurde in diesen File integriert. b) Der Link zur Copy der de.os2.org/Editional-Seite geht jetzt (die OS2.Org Grafiken wurden eliminiert). c) Der Absatz Was RexxTry nicht kann wurde korrigiert. Updates 17. Juni 2003 Tipfehler eleminiert (für mich gilt weiterhin die alte Rechtschreibung !) Ergänzung zur Registrierung Alle Snapshots aus der Rexx Hilfe sind nun als HTML-Text vorhanden Updates 19. Juni 2003 ARJ Links nachgereicht Spruch zum April 2003: Pack OS2 zusammen mit Rexx und Deine Commandozeile ist mächtiger als die Maus OS2, denn OS2 kennt keine Vieren>(Gefunden bei commtalk.de) |