WSH Prozess parallel ausführen und beenden
anderes Script starten und ohne Fehler beenden
Hallo,
wie kann ein WSH-Script ein anderes ausführen und ohne Fehlermeldung beenden?
Hintergrund:
Fortschrittsanzeige für Dateien kopieren
meine bisherige Lösung:
'ScriptEins
set WshShell = wscript.createobject("WScript.shell")
...
set oexec = wshshell.exec("wscript.exe c:\ScriptZwei.vbs")
...
oexec.terminate
ScriptEins kopiert die Dateien
ScriptZwei startet den Internet Explorer für die Fortschrittsanzeige, bei der es ausreicht, dass der User eine Änderung sieht
Nach terminate kommt eine Fehlermeldung "ungültiges Fensterhandle".
Ich vermute, dass ScriptEins zwar ScriptZwei beendet, aber der IE mit der Anzeige dabei seinen Prozess verliert.
Könnte das der Fehler sein?
Wie kann ich den IE von ScriptZwei beenden?
Oder muss ich ScriptZwei anders aufrufen, um es wieder einwandfrei beenden zu können (vielleicht über WshShell.Run Command)?
Vielen Dank!
Hallo,
wie kann ein WSH-Script ein anderes ausführen und ohne Fehlermeldung beenden?
Hintergrund:
Fortschrittsanzeige für Dateien kopieren
meine bisherige Lösung:
'ScriptEins
set WshShell = wscript.createobject("WScript.shell")
...
set oexec = wshshell.exec("wscript.exe c:\ScriptZwei.vbs")
...
oexec.terminate
ScriptEins kopiert die Dateien
ScriptZwei startet den Internet Explorer für die Fortschrittsanzeige, bei der es ausreicht, dass der User eine Änderung sieht
Nach terminate kommt eine Fehlermeldung "ungültiges Fensterhandle".
Ich vermute, dass ScriptEins zwar ScriptZwei beendet, aber der IE mit der Anzeige dabei seinen Prozess verliert.
Könnte das der Fehler sein?
Wie kann ich den IE von ScriptZwei beenden?
Oder muss ich ScriptZwei anders aufrufen, um es wieder einwandfrei beenden zu können (vielleicht über WshShell.Run Command)?
Vielen Dank!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 32782
Url: https://administrator.de/forum/wsh-prozess-parallel-ausfuehren-und-beenden-32782.html
Ausgedruckt am: 23.12.2024 um 04:12 Uhr
4 Kommentare
Neuester Kommentar
Moin cim,
wie Du an der Anzahl der Aufrufe dieser Frage siehst, ist schon gewisses Interesse da.
Aber anscheinend reichen die vorliegenden Information nicht aus, um Dir schlaue Tipps zu geben.
Deshalb bleibt es wieder am Mod hängen.. *seufz*
Rückfragen:
1) besteht das Problem noch oder hast Du es inzwischen selbst gelöst? Wenn ja, wie?
2) Bis zur Aussage "IE starten, um dessen Fortschrittsanzeige zu nutzen" konnte ich Dir gedanklich noch folgen. Aber:
Wenn Du eine Fortschrittsanzeige anzeigst, WTF treibt Dich dann zum .Terminate??
In meiner eher beschränkten Phantasie wäre der gottgegebene erwartete Ablauf, dass das handle ( das doch vermutlich ein handle = CreateObject("InternetExplorer.Application") ist ??) vor sich hin fortschrittsbalkt, so lange kein Error und ReadyState<>4 (Loaded) ist.
Und sich in einem dieser Fälle gefälligst selbst beendet mit WScript.Quit.
Du aber scheinst den Fortschrittsbalken zu starten und irgendwann die aufrufende Hülsenfunktion ("Skript2.vbs") abzuschießen?
Wie kommunizieren denn bei Dir das "arbeitende" (z.B. kopierende) Skript und die "anzeigende" (IE-Laufbalkenzeugs)-Funktion?
Womit ich bei der letzten Frage wäre:
3) Magst Du vielleicht die beiden Schnipsel mal posten?
Habe mich vorher vergewissert, dass unterhalb dieses Kommentars noch ca. 273cm Platz auch für längere Codefragmente wären.
Also keine Scheu.
Grüße
Biber
wie Du an der Anzahl der Aufrufe dieser Frage siehst, ist schon gewisses Interesse da.
Aber anscheinend reichen die vorliegenden Information nicht aus, um Dir schlaue Tipps zu geben.
Deshalb bleibt es wieder am Mod hängen.. *seufz*
Rückfragen:
1) besteht das Problem noch oder hast Du es inzwischen selbst gelöst? Wenn ja, wie?
2) Bis zur Aussage "IE starten, um dessen Fortschrittsanzeige zu nutzen" konnte ich Dir gedanklich noch folgen. Aber:
Wenn Du eine Fortschrittsanzeige anzeigst, WTF treibt Dich dann zum .Terminate??
In meiner eher beschränkten Phantasie wäre der gottgegebene erwartete Ablauf, dass das handle ( das doch vermutlich ein handle = CreateObject("InternetExplorer.Application") ist ??) vor sich hin fortschrittsbalkt, so lange kein Error und ReadyState<>4 (Loaded) ist.
Und sich in einem dieser Fälle gefälligst selbst beendet mit WScript.Quit.
Du aber scheinst den Fortschrittsbalken zu starten und irgendwann die aufrufende Hülsenfunktion ("Skript2.vbs") abzuschießen?
Wie kommunizieren denn bei Dir das "arbeitende" (z.B. kopierende) Skript und die "anzeigende" (IE-Laufbalkenzeugs)-Funktion?
Womit ich bei der letzten Frage wäre:
3) Magst Du vielleicht die beiden Schnipsel mal posten?
Habe mich vorher vergewissert, dass unterhalb dieses Kommentars noch ca. 273cm Platz auch für längere Codefragmente wären.
Also keine Scheu.
Grüße
Biber
Moin cim,
nach längerer Pause mal wieder eine kurze Zwischenmeldung.
Zwischenmeldung, weil eine saubere Antwort doch ein bisschen mehr Zeit brauchen würde.
Aber ein paar Anmerkungen möchte ich doch schon jetzt loswerden, auch wenn es keine umfassende "Antwort" im eigentlichen Sinne wird.
Ich fang mal unsortiert an.
Worauf ich mich nicht einlassen werde, ist die im Tiel formulierte Frage. ("WSH Prozess parallel ausführen und beenden").
Mag auch ein interessantes Thema sein, aber Prozesse, die sich gegenseitig starten und gegenseitig abschießen, das ist eher was für RobotWars oder ähnliches.
So würde ich keine Gebrauchs-Applikation aufziehen.
Ich nehme lieber den Fokus: "Internet-Explorer-Funktionen für eigene Zwecke nutzen" ohne den (kompletten) Explorer anzuzeigen.
Dazu reicht allerdings ein Öffnen einer (weiteren) Explorer-Instanz im vorhandenen Skript - es ist kein zweites Skript nötig.
Beispiel:
An diesem Testschnipsel sind mir -im Vergleich mit Deinem Ansatz- wichtig:
- ich rufe als Seite eine lokale Seite "f:\VBS_Beispiele\Laufbalken\biber.htm" auf.
Die ist vollkommen leer (0 Byte groß). Aber, da sie eben eine lokale Site ist, "darf" ich auch nach dem neueren IE-Security-Patches so etwas wie
..ändern. Ist sonst nämlich tabu - ebenso wie Deine "javascript"-Aufrufe.
Hat mir mein relativ aktuell gepatchter IE sofort um die Ohren gehauen bzw Sicherheitswarnungen vor der Ausführung gebracht.
Ebenso kann ich natürlich z.B. den "Title" oder den "Seiteninhalt" tatsächlich in der lokalen *.htm-Seite als normalen HTML-Text hinterlegen oder aber statt einer echten Seite einfach "about:blank" aufrufen.
Neben der "Zwei-Parallel-Skript-Strategie" und den "javascript"-Funktionen ist das Dritte, was IMHO suboptimal ist, Dein zweiter Parameter im IE-Instanz-initialisieren.
Wenn Du diesen zwiten Parameter "event_" angibst, sagst Du damit, dass Du eine vorhandene EventHandler-Methode durch eine "eigene" ersetzen willst - die muss also die gleichen Inputparameter und die gleichen Rückgabewerte haben wie die Standard-Eventhandler.
Und auch den gleichen Namen, aber mit den angegebenen Prefix ("event_") davor.
Das brauchst Du aber jetzt noch gar nicht - vielleicht später mal, wenn Du eine ProgressBar einbauen willst. Im Moment kannst (und musst meiner Meinung nach) Du den zweiten Parameter weglassen.
Grüße
Biber
nach längerer Pause mal wieder eine kurze Zwischenmeldung.
Zwischenmeldung, weil eine saubere Antwort doch ein bisschen mehr Zeit brauchen würde.
Aber ein paar Anmerkungen möchte ich doch schon jetzt loswerden, auch wenn es keine umfassende "Antwort" im eigentlichen Sinne wird.
Ich fang mal unsortiert an.
Worauf ich mich nicht einlassen werde, ist die im Tiel formulierte Frage. ("WSH Prozess parallel ausführen und beenden").
Mag auch ein interessantes Thema sein, aber Prozesse, die sich gegenseitig starten und gegenseitig abschießen, das ist eher was für RobotWars oder ähnliches.
So würde ich keine Gebrauchs-Applikation aufziehen.
Ich nehme lieber den Fokus: "Internet-Explorer-Funktionen für eigene Zwecke nutzen" ohne den (kompletten) Explorer anzuzeigen.
Dazu reicht allerdings ein Öffnen einer (weiteren) Explorer-Instanz im vorhandenen Skript - es ist kein zweites Skript nötig.
Beispiel:
'LAUFBALKEN#################################################
Option Explicit
dim ieFort, zahl, fso
set fso = wscript.CreateObject("Scripting.FileSystemObject") 'open file-scripting
set ieFort = wscript.createobject("InternetExplorer.Application") 'Internet Explorer für Ablauf
'ieFort.navigate ("javascript:'<title>In Arbeit...</title><body scroll=no>gestartet</body>'")
ieFort.navigate "f:\VBS_Beispiele\Laufbalken\biber.htm"
ieFort.width=150
ieFort.height=100
ieFort.left=100
ieFort.toolbar=false
ieFort.statusbar=false
ieFort.visible=true
do
loop while ieFort.readystate <> 4
ieFort.document.body.innerhtml = "Status"
on Error resume next
do while (zahl < 200) '(fso.folderexists("d:\temp")) 'Darf ich weitermachen?
zahl = zahl +1
wscript.sleep 100
ieFort.document.body.innerhtml = zahl
'if err <> 0 then Wscript.Quit
loop
iefort.quit
wscript.quit
'#########################################################
An diesem Testschnipsel sind mir -im Vergleich mit Deinem Ansatz- wichtig:
- ich rufe als Seite eine lokale Seite "f:\VBS_Beispiele\Laufbalken\biber.htm" auf.
Die ist vollkommen leer (0 Byte groß). Aber, da sie eben eine lokale Site ist, "darf" ich auch nach dem neueren IE-Security-Patches so etwas wie
ieFort.document.body.innerhtml
Hat mir mein relativ aktuell gepatchter IE sofort um die Ohren gehauen bzw Sicherheitswarnungen vor der Ausführung gebracht.
Ebenso kann ich natürlich z.B. den "Title" oder den "Seiteninhalt" tatsächlich in der lokalen *.htm-Seite als normalen HTML-Text hinterlegen oder aber statt einer echten Seite einfach "about:blank" aufrufen.
Neben der "Zwei-Parallel-Skript-Strategie" und den "javascript"-Funktionen ist das Dritte, was IMHO suboptimal ist, Dein zweiter Parameter im IE-Instanz-initialisieren.
set ie = wscript.createobject("InternetExplorer.Application", "event_")
Wenn Du diesen zwiten Parameter "event_" angibst, sagst Du damit, dass Du eine vorhandene EventHandler-Methode durch eine "eigene" ersetzen willst - die muss also die gleichen Inputparameter und die gleichen Rückgabewerte haben wie die Standard-Eventhandler.
Und auch den gleichen Namen, aber mit den angegebenen Prefix ("event_") davor.
Das brauchst Du aber jetzt noch gar nicht - vielleicht später mal, wenn Du eine ProgressBar einbauen willst. Im Moment kannst (und musst meiner Meinung nach) Du den zweiten Parameter weglassen.
Grüße
Biber