Scriptor

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:

  1. 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).
     
  2. 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.

     
  3. 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.
     
  4. 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).
     
  5. 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.
     
  6. 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.
     
  7. 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 ...” .
     
  8. 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?

  1. Der Anwender wählt eine Konfiguration.
  2. Der Anwender wählt den auszuführenden “Job”, (die Scriptliste der gewünschten Aktion), und kickt “Run”..
  3. SCRIPTOR scannt alle Scripte des Jobs durch und sucht nach nicht definierten Parametern.
  4. SCRIPTOR präsentiert dem User eine Eingabemaske für abzufragende oder nicht definierten Parameter.
  5. SCRIPTOR kopiert jedes Script des Jobs in ein Ausführungsverzeichnis und wertet dabei die mit <%..%> eingebetteten Parameter-Ausdrücke aus.
  6. SCRIPTOR führt der Reihe nach jedes Script mit dem angegeben Interpreter aus. Die Console-Ausgabe und Logdateien werden dabei aufgefangen.
  7. 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.
  8. Die Ausgabe der Scripte wird auf Fehler geprüft.
  9. 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
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

[Desktop] [Scriptor] [Localizr] [pb] [LED-Laufschrift] [AutoGamer] [EthoScenes] [EosAutoShooter deutsch] [EosAutoShooter english]