|
Einführung:
SCRIPTOR 2.60 ist eine grafische Oberfläche zum Verwalten
und Ausführen von Abläufen, die mit großen Mengen von
ASCII-Scriptdateien realisiert wurden.
“Script” meint hier nicht nur DOS *.BAT-Dateien, sondern alle ASCII-Dateien, die von einem Anwendungsprogramm ausgeführt oder verarbeitet werden können: BAT-Dateien, SQL-Dateien, Makefiles, Programmsourcen und ähnliches.
Die (wie bei meinen Programmen immer sehr spartanische) Oberfläche sieht so aus:
Features:
SCRIPTOR erleichtert Verwaltung und Ausführung von Scripten durch folgende Features:
-
Längere Batchläufe werden aus kurzen Scripts zusammengesetzt.
Der
Anwender muß nur noch einen Satz von wirklich atomaren Scripten schreiben, die alle
von einander unabhängig sind. Diese Scripts werden einmalig erfasst (mehr Info).
SCRIPTOR verwaltet Listen von Scripts in einer zweistufigen Hierarchie: Listen von
Scripts werden zu “Tasks” zusammen gefasst, Listen von Tasks bilden “Jobs”. Jobs,
Tasks und Einzelscripts bilden die ausführbaren Einheiten (mehr zu Scriptlisten).
- In Scripts können Parameter ausgewertet werden.
In jeden ASCII-Text, der als
Script in die SCRIPTOR-Datenbank eingetragen wurde, können mit einer “<%...%>”
-Syntax JavaScript-Ausdrücke eingesetzt werden, die SCRIPTOR vor der Ausführung
des Scriptes interpretiert und durch das Ergebnis in Textform ersetzt. Die
Parametrisierung von Scriptes ist dadurch einheitlich und unabhängig von der
Parameterverwaltung und den Einschränkungen des jeweiligen Scriptinterpreters. Z.B
werden Parameter in BAT-Dateien mit “%..%” markiert, in POSIX-Makefiles mit “${..
}”, in SQL-Scripten mit “&1”..”&9”, in C/C++-Sourcen mit “#define”, während
andere Interpreter gar keine Parameter erlauben.
-
SCRIPTORs <%..%>-Notation besitzt die volle Leistungsfähigkeit von
JavaScript.
Scripts können durch <%..%>-Tags vor der Ausführung verändert werden
. Der Mechanismus ist ähnlich wie bei serverseitig verarbeiteten ASP oder JSP-HTML
-Seiten (als Scriptsprache dient aber nicht Java, sondern das aus Browsern bekannte
JavaScript):
Durch “<%=..%>” können beliebig komplexe Ausdrücke ausgewertet werden, wobei
SCRIPTOR zusätzlich noch eigene Funktionen bereitstellt: Also numerische Formeln,
logische Ausdrücke, den if-then-else-operator ”? :” und String- und Dateinamen
-Funktionen. Ergibt ein Ausdruck wieder einen <%..%>-Ausdruck, wird dieser
wiederum ausgewertet, so dass das Endergebnis eines Ausdrucks von anderen
Paramatern abhängen kann.
In “<%..%>” kann normaler JavaScript-Code die Erzeugung des Zielscriptes steuern.
Insbesondere können eigene JavaScript-Prozeduren definiert werden, die bei der
Ausführung mittels “writeln()” flexiblen Code in das Zielscript ausgeben können (mehr
zu <%..%> und JavaScript).
Durch “<%@ include..%>” kann Text aus anderen Dateien in ein Script importiert
werden.
Inbesondere können in “<%..%>” auch Zuweisungen an Scripts-Parameter gemacht
werden. Die Änderungen werden dauerhaft in der Datenbank gespeichert, wenn der
Script-Lauf fehlerfrei war. Parameter können gegen solche Zuweisungen durch Setzen
eines “Readonly”-Flags geschützt werden.
- Vor der Ausführung kopiert SCRIPTOR
alle nötigen Scripts in das Ausführungsverzeichnis und
wertet dabei
die eingebetteten <%..%>-Ausdrücke aus.
Die ursprünglichen Scripts werden als “Templates” (Vorlagen) bezeichnet, das
lauffähige Ergebnis der Umwandlung als “Target” (Zielscript) (mehr zu Scripten).
-
SCRIPTOR fängt nach dem Lauf die Ausgabe aller Scripts in einem Logfile auf
und wertet sie nach der Ausführung aus. Dabei werden die Consolen-Ausgabe und evtl.
erzeugte Logdateien berücksichtigt. Die Script-Ausgabe wird nach Script-spezifischen
Erfolgs- und Fehlermustern durchsucht; wenn ein Fehler oder nicht alle Erfolgsmuster
gefunden wurden, wird die Ausführung als fehlerhaft betrachtet, und es gibt eine
Warnmeldung.
Eine wichtiges Feature ist, daß die Ausgabe aller Scripts eines Laufs in einer gut
dokumentierten Logdatei gesammelt wird. Diese Logdatei enthält nicht nur die Ausgabe
der Scripte selbst, sondern auch Angaben über die verwendeten Parameter,
Ausführungsverzeichnisse, die Laufzeiten der Scripts und anderes mehr (mehr zu
Scripten).
Der Logfile wird mit einem Editor an der ersten Fehlerstelle geöffnet, zusätzlich kann aus
der Fehlermeldung eine Fehlerdatei (ErrorTargetSource) und -position extrahiert
werden, die ebenfalls automatisch geöffnet wird (TEXTEDITOR, ERROREXPR).
Wenn die Fehlerdatei durch Umkopieren von SCRIPTOR entstanden ist, wird die
Quelle dieser Datei (ErrorTemplateSource) ebenfalls geöffnet.
-
SCRIPTOR verwaltet auch die Parameter, die in den Scripten verwendet
werden.
Parameter müssen vor der Verwendung dokumentiert werden (mehr zu
Parametern). Ein Satz von Werten für alle verwendeten Parameter heisst
“Konfiguration”. Jeder Parameter kann in jeder Konfiguration einen anderen Wert
haben. Eine Konfiguration ist ein Satz von aufeinander abgestimmten Parameterwerten
(mehr zu Konfigurationen). Die Ausführung der Scripte kann durch Wechsel der
Konfiguration also leicht an andere Umgebungsbedingungen angepasst werden.
Damit nicht pro Konfiguration alle Parameterwerte neu eingegeben werden müssen,
können nach Art einer Klassenhierarchie neue Konfigurationen ihre Werte von anderen
(sogenanten “Basiskonfigurationen”) erben.
Für unbelegte oder besonders markierte Parameter wird vor jedem Lauf dem User eine
Eingabemaske angezeigt.
System-Environment-Variablen können für jedes Script angegeben werden.
-
SCRIPTOR kann Scripte auch ohne Userinterface ausführen
(z.B. zeitgesteuert, oder wiederum als Teil von Scripten). Dann erfolgt die Steuerung über Kommandozeilenparameter nach dem Muster ”/CONFIG ... /JOB ... /AUTORUN
/LOGFILE ...” .
-
SCRIPTOR speichert alle Daten in einer MS-ACCESS-Datenbank
(hier das Datenmodell). Diese .MDB-Datei ist leicht zu sichern und zu transportieren.
Wie arbeitet man mit SCRIPTOR?
- Der Anwender wählt eine Konfiguration.
-
Der Anwender wählt den auszuführenden “Job”, (die Scriptliste der gewünschten
Aktion), und kickt “Run”..
-
SCRIPTOR scannt alle Scripte des Jobs durch und sucht nach nicht definierten
Parametern.
-
SCRIPTOR präsentiert dem User eine Eingabemaske für abzufragende oder nicht
definierten Parameter.
-
SCRIPTOR kopiert jedes Script des Jobs in ein Ausführungsverzeichnis und wertet
dabei die mit <%..%> eingebetteten Parameter-Ausdrücke aus.
-
SCRIPTOR führt der Reihe nach jedes Script mit dem angegeben Interpreter aus. Die
Console-Ausgabe und Logdateien werden dabei aufgefangen.
-
SCRIPTOR erzeugt ausserdem Steuerdateien (BAT-Dateien), mit denen die Scripte für
die angebene Konfiguration auch unabhängig von Scriptor ausgeführt werden können.
- Die Ausgabe der Scripte wird auf Fehler geprüft.
-
Optional wird der Logfile der gesamten Script-Ausführung angezeigt.
Beispiel für die Verarbeitung und Ausführung eines einzelnen Scriptes:
1) Das Script-Template mit eingebettem JavaScript:
rem Dieses BAT-File sichert die aktuelle Version der Datei MYFILE
rem unter fortlaufendem Namen nach dem Muster
rem <MYFILE>~1, <MYFILE>~2, ...
rem MYFILE muss mit vollem Pfad versehen sein!
<%
// JScript-Funktion: testet die Existenz von fname~1, fname~2,
// ... fname~i, bis fname~i nicht mehr existiert.
function NextUnusedFilename(fname) {
var i = 1 ; var found = true ;
var newfilename ;
while (found) {
newfilename = fname + "~" + i ;
// FileExists() ist eine Scriptor-Funktion
found = FileExists(newfilename) ;
if (found) i++ ;
} return newfilename ; }
%>
@echo on
<%=ExtractFileDrive(MYFILE)%>
CD <%=ExtractFilePath(MYFILE)%>
COPY <%=ExtractFileName(MYFILE)%> <%=NextUnusedFilename(MYFILE)%>
DIR info.*
|
|
2) Das lauffähige Target-Script:
rem Dieses BAT-File sichert die aktuelle Version der Datei MYFILE
rem unter fortlaufendem Namen nach dem Muster
rem <MYFILE>~1, <MYFILE>~2, ...
rem MYFILE muss mit vollem Pfad versehen sein!
@echo on c: CD c:\
COPY info.txt c:\info.txt~8
DIR info.*
|
|
3) SCRIPTOR’s Logfile nach der Ausführung (maximale Ausgabe):
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>> e:\Temp\scriptor_DEMOCONF_demoscript_2004_01_10_09_28_50.log <<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>> Content: logfile generated by SCRIPTOR V2.04
>>>>> Generation date: 10.01.2004 09:28:50
>>>>> Configuration: DEMOCONF
>>>>> Configuration info: Beispiel-Configuration
>>>>> Execution of Script "demoscript"
>>>>> Corresponding batch file saved as "e:\Temp\Script_demoscript.bat"
>>>>> Timestamp: 10.01.2004 09:28:50
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>> Generate script "demoscript" (task "") <<<<<<<<<<<<<<<<<<<<
>>>>> Timestamp: 10.01.2004 09:28:50
>>>>> Source: c:\progs\scriptor2\demo_template.bat
>>>>> Target: c:\demo.bat
>>>>>
>>>>> Successfully converted script-source to JScript program.
>>>>> Source = "c:\progs\scriptor2\demo_template.bat", JScript source lines are:
>>>>> [ 1] function main()
>>>>> [ 2] {
>>>>> [
3] scriptor.Writeln("rem Dieses BAT-File sichert die aktuelle Version der Datei MYFILE") ;
>>>>> [ 4] scriptor.Writeln("rem unter fortlaufendem Namen nach dem Muster") ;
>>>>> [ 5] scriptor.Writeln("rem <MYFILE>~1, <MYFILE>~2, ...") ;
>>>>> [ 6] scriptor.Writeln("rem MYFILE muss mit vollem Pfad versehen sein!") ;
>>>>> [ 7] scriptor.Writeln("") ;
>>>>> [ 8]
>>>>> [
9] // JScript-Funktion: testet die Existenz von fname~1, fname~2, ... // fname~i, bis fname~i nicht mehr existiert.
>>>>> [ 10] function NextUnusedFilename(fname) {
>>>>> [ 11] var i = 1 ;
>>>>> [ 12] var found = true ;
>>>>> [ 13] var newfilename ;
>>>>> [ 14] while (found) {
>>>>> [ 15] newfilename = fname + "~" + i ;
>>>>> [ 16] // scriptor.FileExists() ist eine Scriptor-Funktion
>>>>> [ 17] found = scriptor.FileExists(newfilename) ;
>>>>> [ 18] if (found) i++ ;
>>>>> [ 19] }
>>>>> [ 20] return newfilename ;
>>>>> [ 21] }
>>>>> [ 22]
>>>>> [ 23] scriptor.Writeln("") ;
>>>>> [ 24] scriptor.Writeln("") ;
>>>>> [ 25] scriptor.Writeln("@echo on") ;
>>>>> [ 26] scriptor.Write(scriptor.ExtractFileDrive("c:\\info.txt"))
>>>>> [ 27] scriptor.Writeln("") ;
>>>>> [ 28] scriptor.Write("CD ") ;
>>>>> [ 29] scriptor.Write(scriptor.ExtractFilePath("c:\\info.txt"))
>>>>> [ 30] scriptor.Writeln("") ;
>>>>> [ 31] scriptor.Write("COPY ") ;
>>>>> [ 32] scriptor.Write(scriptor.ExtractFileName("c:\\info.txt"))
>>>>> [ 33] scriptor.Write(" ") ;
>>>>> [ 34] scriptor.Write(NextUnusedFilename("c:\\info.txt"))
>>>>> [ 35] scriptor.Writeln("") ;
>>>>> [ 36] scriptor.Writeln("") ;
>>>>> [ 37] scriptor.Writeln("DIR info.*") ;
>>>>> [ 38] }
>>>>> [ 39]
>>>>>
>>>>> Script "c:\demo.bat" successfully generated, source lines are:
>>>>> [ 1] rem Dieses BAT-File sichert die aktuelle Version der Datei MYFILE
>>>>> [ 2] rem unter fortlaufendem Namen nach dem Muster
>>>>> [ 3] rem <MYFILE>~1, <MYFILE>~2, ...
>>>>> [ 4] rem MYFILE muss mit vollem Pfad versehen sein!
>>>>> [ 5]
>>>>> [ 6]
>>>>> [ 7]
>>>>> [ 8] @echo on
>>>>> [ 9] c:
>>>>> [ 10] CD c:\
>>>>> [ 11] COPY info.txt c:\info.txt~8
>>>>> [ 12]
>>>>> [ 13] DIR info.*
>>>>> [ 14]
>>>>> Parameters used while generating "c:\demo.bat" for configuration "DEMOCONF":
>>>>> MYFILE = c:\info.txt = c:\info.txt
>>>>> Saving in batch file e:\Temp\Script_demoscript.bat for later execution:
>>>>> "D:\WINNT\system32\cmd.exe /c c:\demo.bat"
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>> Begin execution of script "demoscript" (task "") <<<<<<<<<<<<<<<
>>>>> Timestamp: 10.01.2004 09:28:50
>>>>> Parameters used while building command line:
>>>>>
COMMAND = <%=defined("OS") && (OS == "Windows_NT") ? "cmd.exe /c" : "command.com /c" %> = cmd.exe /c
>>>>> FILE = c:\demo.bat = c:\demo.bat
>>>>> OS = Windows_NT = Windows_NT
>>>>> Execution directory: c:\
>>>>> Executing: "D:\WINNT\system32\cmd.exe" /c c:\demo.bat
>>>>> Console output follows:
c:\>rem Dieses BAT-File sichert die aktuelle Version der Datei MYFILE
c:\>rem unter fortlaufendem Namen nach dem Muster
c:\>rem <MYFILE>~1, <MYFILE>~2, ...
c:\>rem MYFILE muss mit vollem Pfad versehen sein!
c:\>c:
c:\>CD c:\
c:\>COPY info.txt c:\info.txt~8
1 Datei(en) kopiert.
c:\>DIR info.*
Datentr„ger in Laufwerk C: ist IDE80PART1
Datentr„gernummer: A69C-6645
Verzeichnis von c:\
09.01.2004 22:03 2.934 info.txt
09.01.2004 22:03 2.934 info.txt~1
09.01.2004 22:03 2.934 info.txt~2
09.01.2004 22:03 2.934 info.txt~3
09.01.2004 22:03 2.934 info.txt~4
09.01.2004 22:03 2.934 info.txt~5
09.01.2004 22:03 2.934 info.txt~6
09.01.2004 22:03 2.934 info.txt~7
09.01.2004 22:03 2.934 info.txt~8
9 Datei(en) 26.406 Bytes
0 Verzeichnis(se), 837.320.704 Bytes frei
ÿ
>>>>> Script execution time: 0,050 seconds
>>>>> Timestamp: 10.01.2004 09:28:50
>>>>>>>>>>>>>>>> End execution of script "demoscript" (task "") <<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>
>>>>> Total execution time: 0,172 seconds
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|