Ich schrieb die folgenden zwei Funktionen, und rufen Sie die zweite ("CallAndWait") von JavaScript in Windows Script Host ausgeführt. Meine allgemeine Absicht ist es, ein Befehlszeilenprogramm von einem anderen aufzurufen. Das heißt, ich führe das anfängliche Scripting mit cscript aus und versuche dann, etwas anderes (Ant) von diesem Skript auszuführen.Erfassen der Ausgabe von WshShell.Exec mit Windows Script Host
function readAllFromAny(oExec)
{
if (!oExec.StdOut.AtEndOfStream)
return oExec.StdOut.ReadLine();
if (!oExec.StdErr.AtEndOfStream)
return "STDERR: " + oExec.StdErr.ReadLine();
return -1;
}
// Execute a command line function....
function callAndWait(execStr) {
var oExec = WshShell.Exec(execStr);
while (oExec.Status == 0)
{
WScript.Sleep(100);
var output;
while ((output = readAllFromAny(oExec)) != -1) {
WScript.StdOut.WriteLine(output);
}
}
}
Leider, wenn ich mein Programm ausführen, bekomme ich kein sofortiges Feedback über das, was das aufgerufene Programm tut. Stattdessen scheint die Ausgabe in An und Ab zu kommen, manchmal wartet sie, bis das ursprüngliche Programm beendet ist, und manchmal scheint es, dass sie festgefahren ist. Was ich wirklich machen möchte, ist, dass der erzeugte Prozess tatsächlich den gleichen StdOut wie der aufrufende Prozess teilt, aber ich sehe keinen Weg, dies zu tun. Nur Einstellung oExec.StdOut = WScript.StdOut funktioniert nicht.
Gibt es eine alternative Möglichkeit, Prozesse zu spawnen, die die StdOut & StdErr des Startprozesses teilen? Ich habe versucht, mit "WshShell.Run()", aber das gibt mir eine "Erlaubnis verweigert" -Fehler. Das ist problematisch, weil ich meine Kunden nicht sagen müssen, um zu ändern, wie ihre Windows-Umgebung konfiguriert ist, nur um mein Programm auszuführen.
Was kann ich tun?
Ich glaube nicht, dass es eine Möglichkeit, dies zu tun ist, ich habe für eine Weile selbst gesucht. Meine "Lösung" ist eine Funktion, die einen Befehl vorsetzt, der bei jedem Aufruf eines Befehls die erforderlichen Umgebungsvariablen setzt, wie in WShell.Exec ("% COMSPEC% setenvvars.bat & actual_program.exe"). Ziemlich klobig. – Roel