VBScript Toolbox
Je häufiger Sie Lösungen entwickeln, desto eher merken Sie, dass sie immer wieder die gleichen oder zumindest ähnliche Funktionen programmieren. Das ist bei mir nicht anders und daher fängt früher oder später jeder Entwickler an, sich seine häufig genutzten Komponenten als Bausteine abzulegen. Das waren früher entsprechende Funktionen und Prozeduren und heute sind dies meist entsprechende Klassen.
Auch ich nutze mittlerweile eine ganze Menge von Klassen, die ich in verschiedenen Programmen wieder verwende. Einen Teil dieser Klassen beschreibe und veröffentliche ich auf dieser Seite. Vielleicht helfen Sie ihnen ja bei eigenen Projekten. Sie bin sicher, dass die Klassen nicht fehlerfrei sind und nicht alle Sonderfälle korrekt behandeln. Sie können diese daher gerne für sich selbst verbessern oder mit ihre Verbesserung zusenden.
Die Klassen sind nicht in jeder Hinsicht mit Fehlerbehandlungen versehen. Wenn Sie also z.B. einen ungültigen Dateinamen angeben, dann wird VBScript mit einem Fehler abbrechen. Alle Klassen haben einen Beispielcode am Anfang zum Test und zur Demonstration.
clsDebugWriter
Diese Klasse erlaubt mit eine einfache Implementation eigener Debuggingroutinen. VBScript kann zwar begrenzt mit dem Scriptdebugger analysiert werden, aber oft möchte ich nur eine Ausgabe der Aktionen erreichen. Diese Klasse erlaubt mir daher die Ausgabe von Informationen in eine Datei, das Eventlog oder einen Internet Explorer. Zudem kann ich über den "Level" die Details steuern bzw. Fehler und Warnungen melden. Seit dem ich diese Klasse habe, nutze ich kaum noch "WSCRIPT.ECHO" oder "MSGBOX" als Debugginghilfsmittel.
- public property let outfile(wert)
Hiermit wird der Name der Ausgabedatei definiert - public property let target (wert)
Hiermit werden die verschiedenen Debugziele mit dem entsprechenden "Level" definiert. Ein Eintrag wie "objDebug.target = "file:5 console:2" sorgt dafür, dass alle Meldungen mit 0,1,2 auf die Konsole ausgegeben werden. In der Datei werden alle Meldungen von 0 bis 5 geschrieben. - Sub writeln(strMessage, intseverity)
Schreibt einen Eintrag auf die konfigurierten Debugziele abhängig vom Level. Hierbei nutze ich
0 = Info, 1= Error, 2=Warn, 3..n = debuglevel
So kann ich sehr einfach sicherstellen, dass auch automatisch laufende Skripte immer einen geordneten Weg zur Debugausgaben haben und ich nicht bei jedem VBScript wieder alles neu erfinden muss.
Es kann sein, dass einige Klassen auf dieser Klasse aufbauen und objDebug als Ausgabe nutzen. Sie sollten daher in ihrem Hauptprogramm einfach objDebug als Objekt für diese Klasse definieren.
clsXMLWriter
Nachdem ich die Power von XML-Dateien verstanden habe, habe ich mich natürlich geärgert. dass es gar nicht so einfach ist, aus einem VBScript eine XML-Datei zu erzeugen. Natürlich kann man mit dem MSXML-Objekt und Hantieren mit XML-Knoten eine XML-Datei erstellen. Im .NET-Framwork gibt es den XMLWriter als Hilfe und diese Klasse bildet einen Teil dieser Funktion nach. So kann ich in Skripte sehr viel einfacher XML-Dateien sequentiell erstellen.
- public Property let filename(wert)
Methode zum Spezifizieren der Ausgabedatei - sub Writestylesheet (item)
Spezifikation des Stylesheets - sub WriteStartElement(item)
Startet ein neues Element - sub WriteAttributeString(name, byval value)
Ergänzt ein Attribut zum aktuellen Element - sub WriteElementString(item, byval value)
Erstellt ein Element mit einem Wert - sub WriteEndElement
Schließt das aktuell offene Element - sub DeleteEndElement
Löscht das aktuell offene Element und eventuell schon vorhandene unterelemente - function getXML
Liefert den aktuell erstellten XML-Datenstrom als String zurück. Ideal zum Debuggen - function LoadXML(strxml)
Lädt eine XML-Datei in die Klasse - sub Flush()
Schreibt die aktuelle XML-Datei heraus. Ideal um einen Zwischenstand zu schreiben, speziell wenn das Skript später einen Fehler haben sollte - function getFormattedXML
LIefert den XML-Datenstrom mit einem StyleSheet formatiert als String zurück - sub close()
Schließt die aktuelle XML-Datei ab und schreibt diese als Datei.
clsADCache
In vielen Skripten frage ich immer wieder Felder aus dem Active Directory von wechselnden Objekten ab. Wenn man nun dauernd das gewünschte Zielobjekt neu binden und abfragen muss, dann ist das sehr langsam. Diese Klasse erlaubt mir den einfachen Zugriff und "puffert" alle bisher erhaltenen Ergebnisse. Ich muss daher in meinem eigentlichen Code nicht mehr so stark darauf achten, möglichst optimal das AD zu befragen.
- function getProperty(strDN, strProperty)
Holt das gewünschte Feld des angegebenen DN. Nicht existente Felder werden als "NOT FOUND" zurück gegeben - function getDirectProperty(strDN, strProperty)
Holt ebenfalls das Feld aber liefert das originale Objekt. Das bedeutet natürlich, dass man selbst abfangen muss, ob es ein Variant ,ein Array oder ein Objekt oder gar ein Null-Pointer ist. - sub Flush
Löscht den Cache
clsCSVWriter
Analog zum XMLWriter erlaubt mir diese Klasse eine einfache Ausgabe von Daten in eine CSV-Datei. Natürlich kann ich das Trennzeichen und das umschließungszeichen vorgeben. Da ich die Felder vorher definieren muss, kann die Klasse optional den Header auch mit in die CSV-Datei schreiben. Sehr einfach ist aber das Erstellen eines Datensatzes. Ich kann ohne Rücksicht auf die Reihenfolge der Felder einfach die Daten füllen und das Klassen schreibt die Zeile dann korrekt raus.
- public property let Delimiter (wert)
Legt das Trennzeichen fest. Standard ist Semikolon ";" - public property let Quote(wert)
Legt das Stringzeichen fest. Standard ist """ - sub OpenFile(wert,intFileMode)
Weist die Klasse an, die angegebene Datei zu starten. Der Filemode muss auf Overwrite oder Append gesetzt werden. - sub AddHeader(strvalue)
Erweitert die Definition um ein weiteres Feld - Sub WriteHeader(strPrefix)
Weist die Klasse an, den Header rauszuschreiben. das Prefix wird optional davor gestellt. So kann z.B. auch ein IISLog-Format erzeugt werden. - sub AddField(strfieldname,strvalue)
Routine zum Hinzufügen von Daten für ein bestimmtes Feld - Sub WriteLine
Schreibt die aktuellen Daten als Zeile raus - Sub WriteRawLine(strLine)
Erlaubt das direkte Schreiben einer Zeile, (z.B.: Kommentare bei IISLogs etc - sub StartLine
Beginnt eine neue Zeile. eine bereits begonnene Zeile wird verworfen.
clsLogReader
Analog zur clsCSVWriter gibt es natürlich eine Klasse zum Einlesen von LOG-Dateien. Nach der Konfiguration, ob sich ein Header am Anfan befindet liest die Klasse die Zeilen dann zeilenweise ein und spittet die Felder auf. Der Zugriff erfolgt dann über die entsprechenden Funktionen
- public property let Delimiter(wert)
Legt das trennzeichen fest - public property let HeaderinFirstLine(wert)
Bestimmt, ob der Header in der ersten Zeile zu finden ist. - public property let filename(wert)
Definiert den Dateinamen der Quelle - function GetNextRecord
Sorgt dafür, dass der erste bzw. nächste Record gelesen und analysiert wird. Liefert diese Funktion ein "EOF"-String, dann ist die Klasse am Ende angekommen. - function GetField(strFieldname)
Mit dieser Funktion wird der Inhalt des angegebenen Felds ausgelesen. - function GetRawLine
Liefert die originale Zeile. Ideal für Debuggingzwecke - function FieldExists(wert)
Liefert "True", wenn das angegebene Feld in der Quelldatei überhaupt definiert ist - function GetLastError
Liefert den letzten Fehlercode
clsLDIFReader
Bedingt durch diverse LDAP-Skripte ist diese Klasse zum Einlesen von LDIF-Dateien entstanden.
- function LoadLDFFile(strFilename)
Lädt die angegebene LDIF-Datei ein - function AllObjects
Liefert ein Array aller Einträge vom Typ clsLDIFObject
Die Klasse "clsLDIFObject" dient zum strukturierten Speichern der Daten. Diese Klasse ist sicher noch Ausbaubar aber für einfache Importroutinen reicht Sie vollkommen aus.
Diese Klasse ist aktuell nicht öffentlich verfügbar.
clsValidsmtp
Dies ist eine kleine überschaubare Klasse, die einfach nur einen regulären Ausdruck zur formalen Gültigkeitsprüfung von SMTP-Adressen bereit stellt.
- function Test(wert)
Rufen Sie einfach diese Methode mit der SMTP_Adresse auf und die Rückgabe ist "TRUE", wenn die Adresse korrekt formatiert ist. Dies bedeutet nicht, dass die Mailadresse auch gültig ist.
clsMOM
Diese Klasse nutze ich bei der Entwicklung von Skripten für den Microsoft Operation Manager. Die hier ausgeführten Skripte können nicht auf das "WSCRIPT"-Objekt zurückgreifen. Diese Klasse stellt eine Klasse bereit, die man mit "set ScriptContexr = new clsMOM" instanziert und dann im VBScript wie gewohnt mit Scriptcontext arbeitet. Soll das fertige und getestete Script dann unter MOM laufen, muss man nur diese Definition entfernen, so dass die normale Funktion gegeben ist.
Diese Klasse ist aktuell nicht öffentlich verfügbar.
clsTail
Gerade wenn ich per Skript z.B.: IIS-Logs oder die Exchange Message Tracking Logs zeitnah auswerten möchte, ist natürlich ein TAIL nützlich, der am Ende einer Datei auf neue Zeichen wartet und diese nach Abschluss einer Zeile zurück gibt.
- public property let input(wert)
Definiert die Quelle. Dies kann eine Datei aber auch "-" für STDIN sein - public property let storeposition(wert)
Wird hier ein Registrykey hinterlegt, dann speichert die Klasse die aktuelle Position. So kann nach einem Abbruch oder Ende genau dort wieder aufgesetzt werden. - sub gotolastPos(wert)
Liest aus dem angegebenen Regkey die letzte Position und springt an diese Stelle - public property let storeposition(wert)
Wenn die aktuell verarbeitete Position für ein späteres Wiederaufsetzen genutzt werden sollen - sub gotoLastPos
Geht zur zuletzt verarbeiteten Position zurück, wenn vorher ein entsprechender Registrierungspfads definiert wurde. - sub gototail
Weist die Klasse an, die bestehenden Zeilen zu überspringen und gleich am Ende aufzusetzen - function getline
Diese Funktion liefert eine Zeile zurück. Sie kommt erst zurück, wenn eine Zeile eingetroffen ist. Das Skript wird so lange angehalten.
Diese Klasse ist natürlich sehr rudimentär.
-
Get-Tail
Vielleicht wird aus der Idee einmal Realität
Weitere Links
Bitte nutzen Sie die Links auf VBScript für weitergehende Informationen