Kommandozeilen-Programme aufrufen
Geschrieben von: Christian Holm 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ßbemerkungDies 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. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Applikationen aus ASP.NET ausführen Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |