Tales from the Script

Januar 2005

Veröffentlicht: 01. Feb 2005
*

Vor ein paar Jahren hat jemand ein Tool namens Log Parser 2.0 im Script-Center veröffentlicht. "Was ist das?" haben wir gefragt. "Ein Tool, das SQL Server-Logs und andere Sachen analysiert", kam als Antwort. Und um die Wahrheit zu sagen: Das klang nicht gerade sehr interessant (und außerdem schien es absolut nichts mit dem Thema Scripting zu tun zu haben). Daher haben wir das getan, was Menschen normalerweise immer tun, wenn sie mit etwas Unbekanntem konfrontiert werden: Wir haben es ignoriert (und sind davon ausgegangen, dass es schon irgendwann wieder verschwinden wird).

Anmerkung: Hätten wir zumindest einen Blick auf das Tool werfen sollen, um zu sehen, was es tatsächlich macht? Möglicherweise. Wir haben allerdings eine recht lange Liste mit Dingen, die wir gemacht haben sollten oder noch machen sollten…

Wahrscheinlich können Sie sich denken, worauf das Ganze hinausläuft. Log Parser ist in Wirklichkeit ein cooles kleines Utility, das einige heikle Scripting-Probleme löst. Wir wissen zwar noch immer nicht, was es bedeutet, SQL Server-Protokolle zu analysieren, aber wir wissen, was die aktuellste Log Parser-Version (2.2) (englischsprachig) kann:

Suchen in Ereignisprotokollen nach bestimmten Ereignissen

Suchen im Dateisystem nach Dateien und Ordnern

Suchen in Active Directory nach Objekten

Suchen in allen möglichen Arten von Protokolldateien. Log Parser kann zum Beispiel Protokolle im W3C-Extended-Log-File-Format durchsuchen (dieses Format wird zum Beispiel bei Desktop-Firewalls, Microsoft ISA Server (Internet Security and Acceleration Server), Windows Media Services, Exchange-Protokollen und SMTP-Protokollen (Simple Mail Transfer Protocol) verwendet.

Suchen in IIS-Protokollen (Internet Information Services - Internetinformationsdienste), in Netmon-Capture-Dateien, in der Registrierung und in allen möglichen anderen Protokollen, Dateien und Verzeichnissen.

Und das ist noch lange nicht alles. Log Parser verwendet echte SQL-Abfragen. Das bedeutet, dass Sie Aggregat-Abfragen durchführen können. Sie möchten zum Beispiel wissen, wie viele Ereignisse mit den unterschiedlichen Ereignis-IDs im Protokoll vorhanden sind (also zum Beispiel 37 Mal ID 100, 43 Mal ID 101 usw.)? Kein Problem - Log Parser kann nicht nur das. Sie können die zurückgegebenen Daten beispielsweise mit ORDER BY sortieren oder mit TOP nur die ersten x Datensätze abrufen. Sie können Log Parser 2.2 über die Kommandozeile oder als skriptfähiges COM-Objekt (MSUtil.LogQuery) aufrufen.

Nebenbei bemerkt, wenn wir sagen, dass Log Parser schnell ist, dann ist das nicht nur ein Spruch. Nehmen wir zum Beispiel einmal einen Computer mit den folgenden Daten:

2.39 GHz Prozessor

512 MB RAM

14 GB Festplatte mit 1,5 GB freiem Platz (und mehreren zehntausend Dateien)

Wenn wir mit Log Parser zum Beispiel alle Microsoft PowerPoint®-Dateien (.ppt) auf der Festplatte suchen würden, was glauben Sie, wie lange Log Parser dafür braucht? Einen Tag? Zwei Stunden? Eine Stunde? Genau 14 Sekunden! Eine Suche nach mp3-Dateien war sogar in drei Sekunden erledigt (es gab allerdings auch nur relativ wenige mp3-Dateien auf dem Computer). Bei jpg-Dateien waren es elf Sekunden.

Das Beste an Log Parser ist allerdings, dass es extrem vielseitig ist. Sie können es als Kommandozeilentools oder als Automatisationsobjekt nutzen. Da es sich hier um eine Skripting-Kolumne handelt (ja, manchmal fällt es selbst uns schwer, das zu glauben), werden wir uns auf das Skripting mit Log Parser konzentrieren. Wenn Sie das Tool eher als Kommandozeilenversion nutzen möchten, wird Ihnen die umfangreiche Hilfe von Log Parser auf jeden Fall weiterhelfen (hey - wir können uns schließlich nicht um alles kümmern).

Laden Sie sich Log Parser 2.2 herunter, und versuchen Sie es (wir entschuldigen uns bei Gabriele Giuseppini, dem Entwickler des Tools, dass wir es so lange übersehen haben). Um Sie bei den ersten Schritten mit dem Tool zu unterstützen, haben wir uns überlegt, Ihnen zu zeigen, wie Sie einige einfache - aber trotzdem sehr nützliche - Log Parser-Skripte schreiben können. Und um dies so allgemein wie möglich zu halten, konzentrieren wir uns hierbei auf das Dateisystem (eine Sache, mit der jeder Systemadministrator täglich zu tun hat).

Log Parser 2.2 skriptfähig machen

Bevor Sie mit dem Schreiben von Log Parser-Skripten beginnen können, müssen Sie die entsprechende DLL registrieren. Wechseln Sie hierzu in der Eingabeaufforderung in den Ordner von Log Parser, und geben Sie folgenden Befehl ein:

regsvr32 LogParser.dll

Das ist alles - jetzt kann es losgehen. Klar können Sie Ihrer Mutter eben von den guten Neuigkeiten berichten; wir warten so lange.

Zum SeitenanfangZum Seitenanfang

Ihr erstes Log Parser-Skript

Also, wie sieht ein Log Parser-Skript aus? Heute muss Ihr Glückstag sein. Wie es der Teufel will, haben wir gerade eins da. Das folgende Skript gibt Name und Größe aller Dateien im Ordner C:\Scripts aus (und nur um des Sortierens willen tut es dies nach Dateiname alphabetisch sortiert).

Set objLogParser = CreateObject("MSUtil.LogQuery")
         

         Set objInputFormat = _
         

         CreateObject("MSUtil.LogQuery.FileSystemInputFormat")
         

         objInputFormat.recurse = 0
         

         Set objOutputFormat = _
         

         CreateObject("MSUtil.LogQuery.NativeOutputFormat")
         

         objOutputFormat.rtp = -1
         

         strQuery = "SELECT Name, Size FROM 'C:\Scripts\*.*' ORDER BY Name ASC"
         

         objLogParser.ExecuteBatch strQuery, objInputFormat, objOutputFormat
         

Keine Panik, wir besprechen jede Zeile des Skripts. Auch wenn es für Sie ein wenig kryptisch aussieht - vertrauen Sie uns: Am Schluss dieses Artikels werden Sie in der Lage sein, tausende von Skripten wie dieses zu produzieren.

Die meisten Log Parser-Skripte setzen sich aus fünf Schritten zusammen:

- Erstellen einer Instanz des Log Parser-Objekts

Erstellen und Konfigurieren des InputFormat-Objekts

Erstellen und Konfigurieren des OutputFormat-Objekts

Erstellen einer Log Parser-Abfrage

Ausführen der Abfrage und Zurückgeben der Daten

Sehen wir uns nun jeden dieser Schritte genauer an

Schritt 1: Erstellen einer Instanz des Log Parser-Objekts

Wir wissen, dass Sätze wie “Erstellen einer Instanz von…” meist kompliziert klingen. In Wahrheit ist es aber ganz einfach. Sie erledigen das mit der folgenden Codezeile:

Set objLogParser = CreateObject("MSUtil.LogQuery")

Das ist alles. Nach dieser Codezeile steht ihnen eine Instanz von Log Parser für jeden Einsatzzweck zur Verfügung (ok… möglicherweise nicht für diesen Einsatzzweck - aber für eine Menge anderer Zwecke).

Schritt 2: Erstellen und Konfigurieren des InputFormat-Objekts

Wie bereits erwähnt, kann Log Parser Daten aus allen Arten von Quellen verwenden: Ereignisprotokolle, Registrierung, Protokolldateien etc. Das InputFormat-Objekt legt ganz einfach fest, wo die Daten herkommen sollen. Um Daten des Dateisystems zu verwenden, können Sie die folgende Codezeile nutzen:

Set objInputFormat = _
            

            CreateObject("MSUtil.LogQuery.FileSystemInputFormat")

Schon haben Sie ein InputFormat-Objekt erstellt - in diesem Fall eins, das mit dem Dateisystem arbeitet. Wenn Sie das Objekt erstellt haben, weiß Log Parser automatisch, was mit dem Objekt zu tun ist (in diesem Fall weiß Log Parser, wie es auf das Dateisystem zugreift).

Ach ja: Bei Verwendung des Dateisystems hat InputFormat drei optionale konfigurierbare Eigenschaften:

EigenschaftBeschreibung

recurse

Maximale Zahl der rekursiv durchsuchten Unterverzeichnisse. 0 deaktiviert die Rekursion. -1 definiert eine unbeschränkte Rekursion.

preserveLastAccTime

Beibehalten des letzten Zugriffsdatums für die durchsuchten Dateien (Parameterwert "ON"). Ansonsten wird die Eigenschaft "Letzter Zugriff" für alle Dateien und Ordner aktualisiert.

useLocalTime

Lokale Uhrzeit für alle Felder mit Zeitstempel verwenden (Parameterwert "ON"). Gilt für die Felder "Erstellt am", "Letzter Zugriff am" und " Geändert am". Wenn der Parameter mit "OFF" konfiguriert wird, werden UTC-Zeiten verwendet (Universal Time Coordinates).

Standardmäßig führt Log Parser eine Rekursion aller Unterordner durch. Wenn Sie beispielsweise nur Ordner C:\ durchsuchen möchten, dann müssen Sie die entsprechende Eigenschaft auf 0 setzten:

Set objInputFormat = _
            

            CreateObject("MSUtil.LogQuery.FileSystemInputFormat")
            

            objInputFormat.recurse = 0

Sie möchten eine Rekursion, die zwei Ebenen tief geht?

Set objInputFormat = _
            

            CreateObject("MSUtil.LogQuery.FileSystemInputFormat")
            

            objInputFormat.recurse = 2

Um sicherzustellen, dass jeder Unterordner rekursiv durchsucht wird, setzten Sie die Rekursionseigenschaft auf den Wert -1.

Schritt 3: Erstellen und Konfigurieren des OutputFormat-Objekts

Gut, wenn das InputFormat-Objekt für das Eingabeformat steht, dann ist das OutputFormat-Objekt für was zuständig? Genau - für das Format der von Log Parser zurückgegebenen Daten. Log Parser bietet Ihnen eine große Auswahl an Ausgabeformaten an:

RückgabeformatBeschreibung

Chart

Erstellt Bilddateien mit Diagrammen.

CSV

Schreibt die Daten als kommagetrennte Werte in eine Textdatei.

Datagrid

Zeigt die Ausgaben über eine grafische Benutzerschnittstelle an.

IIS

Schreibt die Ausgabedaten im Microsoft IIS-Protokollformat.

NAT

Schreibt die Ausgabedaten als lesbare tabulatorgetrennte Tabelle.

SQL

Schreibt die Ausgabedatensätze in eine Tabelle in eine SQL-Datenbank.

SysLog

Sendet Nachrichten an einen Syslog-Server; erstellt Textdateien mit Syslog-Nachrichten; sendet Syslog-Nachrichten an Benutzer.

TPL

Schreibt die Ausgaben formatiert entsprechend einer benutzerdefinierten Vorlage.

TSV

Schreibt die Ausgaben durch das Tabulatorzeichen oder durch ein Leerzeichen getrennt in eine Textdatei.

W3C

Schreibt die Ausgaben im W3C Extended Log File-Format.

XML

Schreibt die Ausgaben als XML-Document.

Für den Moment werden wir uns auf das Ausgabeformat NAT konzentrieren. Dies gibt die Daten als übersichtliche, durch Tabulatoren getrennte Tabelle in der Eingabeaufforderung aus. Und so setzen Sie das OutputFormat-Objekt auf NAT:

Set objOutputFormat = _
            

            CreateObject("MSUtil.LogQuery.NativeOutputFormat")

Hey, wir haben doch gesagt, dass das einfach ist. Natürlich stellt Log Parser einige Optionen für die Ausgabe zur Verfügung. Einige der beim NAT-Format interessanten sind:

OptionBeschreibung

rtp

Beim Schreiben nach STDOUT zeigt das Ausgabeformat NAT die Datensätze jeweils so vieler Datensätze auf einen Schlag an, wie über diesen Parameter definiert wurden. Danach muss der Benutzer eine Taste drücken, und die nächsten Datensätze werden angezeigt. Mit -1 werden alle Datensätze auf einen Schlag angezeigt.

headers

Dieser Parameter aktiviert oder deaktiviert die Spaltenüberschriften.

ralign

Mit "ON" werden die Ausgaben rechtsbündig ausgerichtet. Mit "OFF" sind die Ausgaben linksbündig ausgerichtet.

Sie verwenden diese Optionen, indem Sie der entsprechenden Eigenschaft des OutputFormat-Objekts einen Wert zuweisen:

Set objOutputFormat = _
            

            CreateObject("MSUtil.LogQuery.NativeOutputFormat")
            

            objOutputFormat.ralign = "ON"

Schritt 4: Erstellen einer Log Parser-Abfrage

Jetzt wird es richtig interessant. Lassen Sie uns mit einer einfachen Abfrage anfangen; eine Abfrage, die alle Dateien im Ordner C:\Scripts und deren Größe ausgibt und die Ausgabeliste alphabetisch sortiert:

strQuery = "SELECT Name, Size FROM 'C:\Scripts\*.*' ORDER BY Name ASC"

Wenn Sie sich auch nur etwas mit SQL auskennen, dann sollte Ihnen diese Codezeile keine Probleme bereiten. Wie bei den meisten SQL-Abfragen stehen am Anfang die Eigenschaften (in diesem Fall "Name" und "Size" - wenn wir alle Eigenschaften abfragen wollten, dann würden wir stattdessen Select * FROM verwenden). Dann müssen wir Log Parser mitteilen, wo die Informationen herkommen sollen. Bei einer typischen SQL-Abfrage würden Sie hier den Namen einer Tabelle in der Datenbank angeben. Da wir aber mit dem Dateisystem arbeiten möchten, übergeben wir einfach den Namen des Ordners, in dem wir mit der Suche beginnen möchten: 'C:\Scripts\*.*’ .

Die Wildcards ("*.*") sorgen dafür, dass Sie eine Liste aller Dateien im Ordner erhalten. Wenn Sie die Wildcards weglassen, dann gibt Log Parser nur einen Fehler aus (“Cannot find any file or folder matching ‘C:\Scripts’”). Wenn Sie nur an bestimmten Dateien interessiert sind - sagen wir an allen .vbs-Dateien - dann sähe die Abfrage zum Beispiel so aus:

strQuery = "SELECT Name, Size FROM 'C:\Scripts\*.vbs' " & _
            

            "ORDER BY Name ASC"

Wenn Sie nach einer bestimmten Datei in Laufwerk C suchen, dann können Sie die WHERE-Bedingung verwenden:

strQuery = "SELECT Name, Size FROM 'C:\*.*' WHERE " & _
            

            "NAME = 'inventory.vbs' ORDER BY Name ASC"

Ok, einige von Ihnen sehen jetzt ein wenig verwirrt aus. Woher wussten wir, dass "Name" und "Size" Eigenschaften sind, die wir in unseren Abfragen verwenden können? Ganz einfach: Wir haben gespickt. Wir haben uns die beim Dateisystem-Objekt verfügbaren Felder in der Hilfe von Log Parser angeschaut.

FeldBeschreibung

Path

Vollständiger Pfad der Datei oder des Ordners

Name

Name der Datei oder des Ordners

Size

Größe der Datei in Byte

Attributes

Datei- oder Ordnerattribute. Zum Beispiel:

Archive

Compressed

Directory

Encrypted

Hidden

Offline

ReadOnly

System

Temporary

CreationTime

Datum und Uhrzeit der Erstellung der Datei oder des Ordners (entweder lokale Zeit oder UTC-Zeit - abhängig vom Wert des Parameters useLocalTime). Der Zeitstempel sieht so aus: 6/10/2004 1:29:50 PM.

LastAccessTime

Datum und Uhrzeit des letzten Zugriffs auf die Datei oder den Ordner. (entweder lokale Zeit oder UTC-Zeit - abhängig vom Wert des Parameters useLocalTime). Der Zeitstempel sieht so aus: 6/10/2004 1:29:50 PM.

LastWriteTime

Datum und Uhrzeit der letzten Änderung der Datei oder des Ordners. (entweder lokale Zeit oder UTC-Zeit - abhängig vom Wert des Parameters useLocalTime). Der Zeitstempel sieht so aus: 6/10/2004 1:29:50 PM.

FileVersion

Dateiversion. Normalerweise bei ausführbaren Dateien und DLLs.

ProductVersion

Version des Produktes, zu dem die Datei gehört.

InternalName

Interner Name der Datei.

ProductName

Name des Produktes, zu dem die Datei gehört.

CompanyName

Name des Herstellers der Datei.

LegalCopyright

Copyright-Hinweise zur Datei.

LegalTrademarks

Warenzeichen und registrierte Warenzeichen in Bezug auf die Datei.

PrivateBuild

Private Versionsinformationen der Datei.

SpecialBuild

Spezielle Build-Hinweise.

Comments

Kommentare

FileDescription

Beschreibung

OriginalFilename

Original-Dateiname

Schritt 5: Ausführen der Abfrage und Zurückgeben der Daten

Jetzt müssen Sie die Abfrage nur noch ausführen und auf die Rückgabe von Daten von Log Parser warten. Hierzu ist nur eine Zeile Code nötig:

objLogParser.ExecuteBatch strQuery, objInputFormat, objOutputFormat

Wie Sie sehen können, rufen Sie einfach die Methode ExecuteBatch mit drei Parametern auf: Die Variable mit Ihrer SQL-Abfrage ( strQuery ); die Objektreferenz für Ihr InputFormat-Objekt (objInputFormat); und die Objektreferenz für Ihr Ausgabeformat ( objOutputFormat ). Und was passiert dann? Sie sollten ganz einfach eine Ausgabe erhalten, die so oder so ähnlich aussieht:

sg010501.gif

Bild maximieren

Anmerkung: Das Script hat genau eine Sekunde gebraucht.

Alles in allem ganz nett. Aber vielleicht ist Ihnen aufgefallen, dass die ersten beiden Einträge in der Tabelle nur Punkte sind. Warum ist das so? Erinnern Sie sich an die guten alten MS-DOS-Zeiten? Der einzelne Punkt steht für das aktuelle Verzeichnis, und der doppelte Punkt steht für das übergeordnete Verzeichnis. Das ist zwar toll, aber da es sich nicht um Dateien handelt, möchten wir diese Einträge in unserer Ausgabe nicht mehr sehen (Das trifft übrigens nicht nur auf die beiden ersten Zeilen zu. Wenn es Unterordner gibt, dann werden auch diese in unserer Ausgabe angezeigt.)

Können wir die Ordner und Unterordner also loswerden und nur Dateien in der Ausgabe anzeigen lassen? Darauf können Sie wetten. Wie sich herausstellt, haben Ordner ein Attribut (Directory), dass das Dateisystem nutzt, um zwischen Dateien und Ordnern zu unterscheiden. Alles, was wir machen müssen, ist also, unsere Abfrage entsprechend zu ändern:

strQuery = "SELECT Name, Size FROM 'C:\Scripts\*.*' WHERE NOT " & _
         

         "Attributes LIKE '%D%' ORDER BY Name"

Das SQL-Schlüsselwort WHERE NOT Attribute bedeutet ganz einfach: “Wo das Attribut nicht aktiviert ist". Mit anderen Worten: Wenn das Verzeichnisattribut aktiviert ist, dann handelt es sich bei dem Baby um einen Ordner, und wir wollen es nicht.

Wir verwenden den Operator LIKE, um zu prüfen, ob das fragliche Attribut mit dem Buchstaben D beginnt. Wenn das so ist, dann ist es ein Ordner. Um nach versteckten Dateien zu suchen, verwenden wir LIKE ‘%H%’ , für verschlüsselte Dateien LIKE ‘%E%’ usw.

Anmerkung: Hierbei handelt es sich nicht notwendigerweise um den universellen Weg, auf Datei- und Ordnerattribute zu prüfen. Außerdem wird der LIKE-Operator etwas anders verwendet als LIKE in normalen SQL-Abfragen. Bei Standard-SQL gibt LIKE ‘%E%’ jedes Attribut zurück, in dem der Buchstabe E irgendwo im Attributnamen auftaucht. Bei Log Parser werden jedoch nur die verschlüsselten Dateien zurückgegeben (also nur die Attribute, die mit einem E beginnen).

Und so sieht unser überarbeitetes Skript nun inzwischen aus:

Set objLogParser = CreateObject("MSUtil.LogQuery")
         

         Set objInputFormat = CreateObject("MSUtil.LogQuery.FileSystemInputFormat")
         

         objInputFormat.Recurse = 0
         

         Set objOutputFormat = CreateObject("MSUtil.LogQuery.NativeOutputFormat")
         

         objOutputFormat.rtp = -1
         

         strQuery = "SELECT Name, Size FROM 'C:\Scripts\*.*' WHERE NOT " & _
         

         "Attributes LIKE '%D%' ORDER BY Name"
         

         objLogParser.ExecuteBatch strQuery, objInputFormat, objOutputFormat

Die Ausgabe sieht jetzt so aus:

sg010501.gif

Bild maximieren

Besser, aber noch immer nicht perfekt. Sehen Sie sich zum Beispiel einmal an, wie die Dateien sortiert sind.

Copy of kix_wmi.kix
         

         New Text Document.txt
         

         New_user.sxls
         

         Process.ppt
         

         Script1.vbs
         

         bookmarkdoc.doc
         

         computers.txt

Was zum ...? Wenn alphabetisch sortiert wird, warum kommen bookmarkdoc.doc und computers.txt dann nach Script1.vbs?

Tja, das passiert, weil Log Parser nach den ACSII-Werten der Zeichen des Dateinamens sortiert. Im ASCII-System kommen alle Großbuchstaben vor den Kleinbuchstaben. Daher landet eine Datei mit dem Namen ZZZZZZZZ.doc vor einer Datei mit dem Namen aaaaaaaa.doc. Traurig, aber wahr!

Es stellt sich allerdings heraus, dass Log Parser eine große Menge an Funktionen bietet, mit denen Sie die Daten direkt bei deren Abruf verändern können. Wenn wir zum Beispiel nur Kleinbuchstaben verwenden würden, dann würden die Dateien richtig sortiert. Also sagen wir Log Parser einfach, dass alle Großbuchstaben wie Kleinbuchstaben behandelt werden sollen:

strQuery = "SELECT TO_LOWERCASE (Name) AS NewName, Size FROM " & _
         

         "'C:\Scripts\*.*' WHERE NOT Attributes LIKE '%D%' ORDER BY NewName"

Hierzu verwenden wir die Funktion TO_LOWERCASE , um alle Dateinamen in Kleinbuchstaben zu konvertieren (beachten Sie, dass die Konvertierung nur innerhalb von Log Parser durchgeführt wird - die tatsächlichen Dateinamen ändern sich nicht). Wiederum sieht die Syntax vielleicht etwas gewöhnungsbedürftig aus (es sei denn, Sie kennen sich mit SQL aus).

Alles, was wir machen, ist, statt die Eigenschaft "Name" zu verwenden, die Eigenschaft mit der Funktion TO_LOWERCASE in Kleinbuchstaben zu konvertieren. Und da hierdurch eine neue Eigenschaft erstellt wird, deren Namen nicht mehr "Name" ist, müssen wir dieser mit dem AS-Operator einen neuen Namen zuweisen (uns ist nur das total kreative "NewName" eingefallen - aber natürlich können Sie einen beliebigen Namen verwenden). Das ganze führt dazu, dass Log Parser alle Dateinamen abfragt, diese in Kleinbuchstaben konvertiert und die Liste dann sortiert. Das entsprechende Skript sieht so aus:

Set objLogParser = CreateObject("MSUtil.LogQuery")
         

         Set objInputFormat = CreateObject("MSUtil.LogQuery.FileSystemInputFormat")
         

         objInputFormat.Recurse = 0
         

         Set objOutputFormat = CreateObject("MSUtil.LogQuery.NativeOutputFormat")
         

         objOutputFormat.rtp = -1
         

         strQuery = "SELECT TO_LOWERCASE (Name) AS NewName, Size FROM " & _
         

         "'C:\Scripts\*.*' WHERE NOT Attributes LIKE '%D%' ORDER BY NewName"
         

         objLogParser.ExecuteBatch strQuery, objInputFormat, objOutputFormat

Und die Ausgabe:

sg010501.gif

Bild maximieren

Stimmt. Besser wird es nicht mehr. In der Lage zu sein, Dateien unabhängig von Groß- und Kleinbuchstaben alphabetisch zu sortieren, sollte abenteuerlich für jeden sein.

Zum SeitenanfangZum Seitenanfang

Eine Collection mit Dateien abrufen

Die Methode ExecuteBatch führt ein Skript aus und zeigt die Ausgaben dann in der Eingabeaufforderung an oder speichert sie in eine HTML-Datei - oder was auch immer. Das ist wirklich toll - vorausgesetzt, Sie möchten nicht mehr als die Ausgaben anzeigen oder speichern. Was aber, wenn Sie etwas Anderes im Sinn haben? Sagen wir, Sie möchten die zehn ältesten Dateien auf einem Computer suchen, um diese zu archivieren. Oder Sie möchten alle Dateien finden, die größer als fünf MB sind, um diese zu komprimieren. In solchen Fällen wollen Sie die Ausgaben nicht wirklich anzeigen oder speichern. Stattdessen möchten Sie direkt mit den ausgegebenen Daten weiter arbeiten.

Schauen wir uns also ein Log Parser-Skript an, das die abgefragten Daten - statt sie anzuzeigen - als Recordset zur Verfügung stellt:

Set objLogParser = CreateObject("MSUtil.LogQuery")
         

         Set objInputFormat = _
         

         CreateObject("MSUtil.LogQuery.FileSystemInputFormat")
         

         objInputFormat.recurse = 0
         

         strQuery = "SELECT TO_LOWERCASE (Name) AS NewName, Size FROM " & _
         

         "'C:\Scripts\*.*' WHERE NOT Attributes LIKE '%D%' ORDER BY NewName"
         

         Set objRecordSet = objLogParser.Execute(strQuery, objInputFormat)
         

         Do While Not objRecordSet.AtEnd
         

         Set objRecord = objRecordSet.GetRecord
         

         Wscript.Echo "Name: " & objRecord.GetValue("NewName")
         

         Wscript.Echo "File size: " & objRecord.GetValue("Size")
         

         objRecordSet.MoveNext
         

         Loop

Wie Sie sehen, ist das gar nicht so schwer. In der ersten Hälfte des Skriptes gibt es tatsächlich nur zwei Unterschiede zum vorherigen Skript. Erstens erstellen wir kein OutputFormat-Objekt. Und zweitens verwenden wir die ExecuteBatch-Methode nicht. Stattdessen nutzen wir die Methode Execute mit zwei Parametern: Der Abfrage, die wir durchführen möchten, und dem InputFormat-Objekt ( objInputFormat ). Die entsprechende Codezeile sieht so aus:

Set objRecordSet = objLogParser.Execute(strQuery, objInputFormat)

Nachdem diese Codezeile abgearbeitet wurde, haben wir eine Liste aller in C_\Scripts gefundenen Dateien. Der Unterschied ist nur, dass diese Dateien nicht in der Eingabeaufforderung angezeigt werden. Stattdessen werden die Dateien in einem Recordset mit dem Namen objRecordSet gespeichert. Wenn wir auf die Daten zugreifen möchten, dann müssen wir nur das Recordset durchlaufen. Und genau das erledigen wir in der zweiten Hälfte des Skripts:

Do While Not objRecordSet.AtEnd
         

         Set objRecord = objRecordSet.GetRecord
         

         Wscript.Echo "Name: " & objRecord.GetValue("NewName")
         

         Wscript.Echo "File size: " & objRecord.GetValue("Size")
         

         objRecordSet.MoveNext
         

         Loop

Wir verwenden eine Do/While-Schleife, die so lange durchlaufen wird, bis das Ende des Recordsets erreicht ist ( objRecordSet.AtEnd ). In der Schleife nutzen wir die Methode GetRecord, um den ersten Datensatz im Recordset abzurufen, und mit der Methode GetValue lesen wir den Wert des Feldes NewName aus und zeigen diesen an. Das ist alles. Die Methode MoveNext bringt uns zum nächsten Datensatz, und diesen Prozess wiederholen wir einfach. Die Ausgabe sollte jetzt so aussehen:

sg010501.gif

Bild maximieren

Cool, was? Nun, die simple Ausgabe von Werten ist zugegebenermaßen nicht die aufregendste Möglichkeit, mit Recordsets zu arbeiten - aber es zeigt hervorragend, wie Sie die Daten abrufen können.

Wenn Sie also Informationen in Bezug auf Dateien und Ordner abfragen müssen, dann ist Log Parser - wie Sie sehen - ein ziemlich praktisches Tool. Es ist allerdings mehr als nur ein extravaganter Ersatz für den dir-Befehl. Es kann die gleichen Informationen aus Ereignisprotokollen, Active Directory, den unterschiedlichsten Protokolldateien und vielem mehr auslesen. Hinsichtlich dessen, was mit Log Parser alles möglich ist, haben wir nicht mal an der Oberfläche gekratzt. Wir werden in den nächsten Monaten versuchen, ein paar Log Parser-Skripte (und Abfragen) im Script Center bereitzustellen. Bis dahin können Sie die Beispiele aus dem Log Parser-Download nutzen.


Zum SeitenanfangZum Seitenanfang