Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Kommandozeilen-Programme aufrufen

Geschrieben von: Christian Holm
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

Wie (hoffentlich) allgemein bekannt ist, kann man u.a. mit dem Windows Scripting Host Programme ausführen lassen. In diesem Artikel wollen wir uns aber nur mit der Ausführung von Konsolenanwendungen beschäftigen, diese aber mittels WSH von ASP aus aufrufen. Wir ordnen der Anwendung eine für jeden Benutzer separate Output-Pipe zu, die den von der Anwendung produzierten Output in eine Datei schreibt. Diesen Inhalt wollen wir dann einfach in ein Browserfenster dumpen.

Wir wollen uns also mit Kommandozeilenanwendungen beschäftigen, die einen Output erzeugen, allerdings keinen Input (außer Parameter) verlangen. Beispiele dafür wären die Befehle dir, iisreset, ping, etc. . Diesen Output wollen wir mit Hilfe des Pipeoperators (>) in eine Textdatei umleiten. Damit jeder Benutzer - bei gleichzeitigem Zugriff mehrerer Benutzer auf das ASP Skript - seinen Output auch erhält, verwenden wir die GetTempName Methode um die Outputdatei zu generieren. Diese Methode erstellt einen eindeutigen Dateinamen, und somit kann kein User den Output eines anderen überschreiben.

Da wir den Output nur in ein Browserfenster dumpen wollen, löschen wir danach sofort wieder die zuvor erstellte Datei. Auf das Löschen sollte man aber generell nicht vergessen, da sich sonst sehr viele Dateien ansammeln könnten.

Für das heutige Artikelbeispiel habe ich den ping Befehl ausgewählt. Wichtig dabei ist, daß Sie das Beispiel in Zusammenhang mit dem Pipeoperator nicht mit Win32 Applikationen wie Notepad oder ISM ausprobieren. Es könnte unter Umständen zu eigenartigen Nebenwirkungen führen, die das System (mehr oder weniger) beeinträchtigen könnten.

Der für den Aufruf benötigte Code ist nicht besonders kompliziert. Fangen wir daher gleich damit an (CmdPiping.asp):

<% 
Set fso = Server.CreateObject("Scripting.FileSystemObject")
strPath = Server.MapPath("./")
strTempName = fso.GetTempName
strTempNameBat = fso.GetTempName
strFileName= Replace(strTempName,".tmp",".txt")
strBatFileName= Replace(strTempName,".tmp",".bat")
strPathFile = strPath & "\" & strFileName
strPathBatFile = strPath & "\" & strBatFileName

Set objFile = fso.CreateTextFile(strPathFile, True)
objFile.Close
Set objBatFile = fso.CreateTextFile(strPathBatFile, True)
objBatFile.WriteLine("D:\WINNT\system32\ping.exe inferis > " & strPathFile)
objBatFile.Close

Set objWsh = Server.CreateObject("WScript.Shell")
nRetVal = objWsh.Run(strPathBatFile, 1, True)

In diesem ersten Abschnitt instanzieren wir zunächst mit der Server.CreateObject Funktion das FileSystemObject Objekt. Mit der Server.MapPath Funktion lesen wir den aktuellen physikalischen Pfad, aus dem das Script ausgeführt wurde.

Nun generieren wir mit Hilfe der GetTempName Methode einen eindeutigen Dateinamen für den Textoutput des Ergebnisses des ping Befehls. Da die GetTempName Methode eigentlich erstrangig für das Generieren von einzigartigen Temporärdateien dient, müssen wir mit der Replace Funktion die Dateiendung ".tmp" in ".txt" umbenennen.

Den aus den beiden Variablen strPath und strFileName generierten Pfad weisen wir der Variablen strPathFile zu, um den Sourcecode übersichtlicher zu machen und auch die Ausführung des Skriptes zu beschleunigen. Dies wird durch die einmalige Ablegung des Pfades in der Variablen am Anfang des Scriptes erreicht.

Die Batchdatei die wir hier zusätzlich generieren (strPathBatFile, später objBatFile), dient dazu sicherzustellen, daß der Befehl auch den Output mittels Pipeoperator weitergibt. Dieser Winkelzug dient dazu, daß das Skript auf Rechnern mit verschiedenen Versionen von WSH läuft (einige Versionen erlauben den Direktaufruf, andere funktionieren wiederum nur mit der Batchdatei).

Nun instanzieren wir das Windows Scripting Host Objekt. Daher können wir nun mit der Run Methode des Objektes den ping Befehl ausführen - oder genauer gesagt, die Batchdatei, die das Ping ausführt.

Die Run Methode des WSH benötigt hier noch zwei zusätzliche Parameter. Der erste ist das intWindowStyle Argument. Dieses sorgt dafür, daß ein Fenster aktiviert und aufgepopt wird. Das zweite Argument bWaitOnReturn ist in diesem Fall sehr wichtig, da hier erst zum Skript zurückgekehrt werden soll, wenn der Befehl erfolgreich beendet ist. Wenn Sie dieses Argument weglassen, wird bei längeren Ausführungszeiten kein Output in die Textdatei geschrieben (oder erst, wenn das ganze ASP Script bereits abgearbeitet ist).

Hierbei ist zu beachten, daß Sie bei der Befehlsangabe den vollen Pfad, in welchem sich die Executable befindet, angeben müssen. Weiters muß der Benutzer - der dieses Script ausführt - die entsprechenden Permissions haben. Es wird ja durch den Pipeoperator eine Datei in einem (Unter)Verzeichnis des Webservers erstellt.

Nun wollen wir den Inhalt aus der am Webserver gespeicherten Datei Zeile für Zeile auslesen. Dies geschieht mittels der Objekte und Methoden des FileSystemObject Objektes:

Set TextStream = fso.OpenTextFile(strPathFile, 1)

strOutput = ""
While Not TextStream.AtEndOfStream 
   strOutput = strOutput &  TextStream.ReadLine
Wend

Set MyDelFile = fso.GetFile(strPathFile)
MyDelFile.Delete

Set MyDelBatFile = fso.GetFile(strPathBatFile)
MyDelBatFile.Delete

Die OpenTextFile Methode gibt einen Textstream zurück, welchen wir zum Lesen der Datei benötigen. Die 1 in der Zeile

Set TextStream = fso.OpenTextFile(strPathFile, 1)

ist der numerische Wert für die ForReading Konstante. Diese ist wiederum ein Argument des IOModes der OpenTextFile Methode. Der IOMode bestimmt die Eingabe/Ausgabe Operationen Lesen, Schreiben oder Hinzufügen.

Mit Hilfe einer while-Schleife lesen wir nun den Inhalt der Textdatei Zeile für Zeile bis zum Ende des Streams (AtEndOfStream) ein. Jede gelesene Zeile wird der strOutput Variablen hinzugefügt. Den Inhalt der Variable dumpen wir später in ein Browserfenster.

Zuvor löschen wir aber die jetzt nicht mehr benötigte Text- und Batchdatei durch die Delete Methode des FileSystemObject Objektes. Nun können wir den Inhalt der strOutput Variable zum Browser schicken:

<pre>
<%=strOutput%>
</pre>

Wenn Sie das Beispiel - natürlich angepaßt an Ihre Verhältnisse - auf einem Webserver ausführen, könnten Sie z.B. so ein ähnliches Ergebnis erzielen:

Schlußbemerkung

Dies war ein einfaches Beispiel um zu zeigen, wie man den Windows Scripting Host (WSH) verwenden kann, um eine Konsolenanwendung auszuführen. Solange man keinen Input an die Konsolenanwendung schicken muß, ist WSH ein probates Mittel um den Output von solchen Anwendungen abzufangen und an den Client zu senden.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010516.zip

Verwandte Artikel

Applikationen aus ASP.NET ausführen
http:/www.aspheute.com/artikel/20010220.htm
Automation - WSH versus Wget
http:/www.aspheute.com/artikel/20000511.htm
Mailadressen-überprüfen für Fortgeschrittene
http:/www.aspheute.com/artikel/20000822.htm
Schluß mit lustig Teil 3 - das Hfnetchk Tool
http:/www.aspheute.com/artikel/20010928.htm
Siteüberwachung mit Scheduled Tasks
http:/www.aspheute.com/artikel/20010419.htm

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.