cim
Goto Top

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!

Content-Key: 32782

Url: https://administrator.de/contentid/32782

Printed on: April 16, 2024 at 23:04 o'clock

Member: Biber
Biber Aug 07, 2006 at 18:02:59 (UTC)
Goto Top
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
Member: cim
cim Aug 08, 2006 at 05:07:27 (UTC)
Goto Top
Moin Biber,
sorry, dass ich erst jetzt antworte, aber ich habe die Scripte noch mit ein paar Kommentaren versehen.
Und vielen Dank für die Hilfe!

Ich suche hier gerade etwas, wie ich Dateien anhängen kann ... äh ... aber das geht wohl nur im Beitrag und nicht in Antworten. Wiedemauchsei - dann brauche ich wohl die 273 cm.

Das Problem besteht immer noch. Da ich aber kein Erste-Reihe-Vorne-Sitzer bin und ich Programmieren nicht wirklich gelernt habe, habe ich ein wenig geschummelt:
Das Main-Programm erstellt ein Verzeichnis und startet den Laufbalken (sorry, nur ein Zähler, aber immerhin). Laufbalken schließt sich selbst, wenn Main das Verzeichnis gelöscht hat. Nicht elegant, aber tut.

Aus irgenwelchen Gründen wurden bei mir zwar die Scripte über Quit beendet, allerdings hatte ich im Taskmanager noch die Prozesse (das beim Testen ziemlich ätzend wurde). Daher "terminate". Habe ich aus einem Buch "Inside Windows Script Host".

Variablen mit q haben etwas mit der Quelle zu tun, z = Ziel. Ich hoffe, dass sich durch die Formatierungen die Kommentare nicht allzu sehr verschoben haben.

Und überhaupt: was ist WTF? WZT hätte ich mir noch denken können...

Also schon Mal vielen Dank!
Schöne Grüße!

'MAIN#####################################################  
Option Explicit			'Variablen müssen definieren werden  

KopieStart()			
'Programmaufruf, weil "exit" sonst nicht möglich und Prozess nicht schließt  

'_______________________________________________________________________  
function KopieStart

dim fso, explorer, WshShell, oExec
dim start, ende, zeit
dim Datum, Monat, Tag
dim ie, liste, listeIE, Schreibschutz, nummer, i, j, StatusOrdner
dim z_verz, z_expl, z_datei
dim q_datei, q_verz, q_expl, q_liste
'dim netzwerk  

set fso = wscript.CreateObject("Scripting.FileSystemObject")									'open file-scripting  
'set netzwerk = wscript.createobject("wscript.network")  
set explorer = wscript.createobject("shell.application")  
set WshShell = wscript.createobject("WScript.shell")  

if msgbox("SOLL DIE SICHERUNG DER DATEN JETZT GESTARTET WERDEN?", vbyesno + vbinformation, "DATEIEN KOPIEREN") = vbno then exit function  

monat = month(date)													'Datum für Verzeichnisnamen  
if month(date) < 10 then monat = "0" & month(date)  
tag = day(date)
if day(date) < 10 then monat = "0" & day(date)  
datum = year(date) & "_" & monat & "_" & tag  
start=timer
liste=" "  
listeIE=" "  
nummer=0
schreibschutz = 0

set q_expl = explorer.BrowseForFolder(&H0,"Bitte QUELL-Ordner auswählen:",&H01 ,17)   
if q_expl = "" or isnull(q_expl) then exit function		'Wenn Abbrechen dann Exit  
q_verz = q_expl.parentfolder.parsename(q_expl.title).path & "\"								'den gesamten Ziel-Pfad ermitteln  
set q_liste = fso.getfolder(q_verz)

set z_expl = explorer.BrowseForFolder(&H0,"Bitte ZIEL-Ordner auswählen:",&H01 ,17)   
if z_expl = "" or isnull(z_expl) then exit function											'Wenn Abbrechen dann Exit  
z_verz = z_expl.parentfolder.parsename(z_expl.title).path & "\" & datum & "\"						'den gesamten Ziel-Pfad ermitteln  
fso.createfolder(z_verz)

set ie = wscript.createobject("InternetExplorer.Application", "event_")							'Internet Explorer für Ablauf  
ie.navigate ("javascript:'<title>Sicherung</title><body scroll=no>Sicherung von Dateien und Verzeichnissen</body>'")  
ie.width=500
ie.height=250
ie.toolbar=false
ie.statusbar=false
ie.visible=true
do
loop while ie.readystate <> 4
ie.document.body.innerhtml = "Sicherung wird gestartet"  

fso.createfolder "c:\temp\XYZSaveStatusABC"									'Ordner anlegen für Prüfung, ob Laufbalken ausgeführt wird  
set StatusOrdner=fso.getfolder("c:\temp\XYZSaveStatusABC")  
wscript.sleep 100

set oexec = wshshell.exec("wscript.exe c:\laufbalken.vbs")					'Aufruf Laufbalken-Script  

set q_datei = q_liste.files
for each i in q_datei
	if i.attributes = 1 then schreibschutz = schreibschutz +1
	liste =  i & vbcrlf	& liste 
	listeIE =  i & "  
" & listeIE   
	ie.document.body.innerhtml = listeIE
	nummer=nummer+1
	fso.CopyFile i, z_verz, true
next

set q_datei = q_liste.subfolders
for each j in q_datei
	if j.attributes = 1 then schreibschutz = schreibschutz +1
	liste =  j & vbcrlf	& liste 
	listeIE =  j & "  
" & listeIE   
	ie.document.body.innerhtml = listeIE
	nummer=nummer+1
	fso.Copyfolder j, z_verz, true
next

statusOrdner.delete		'Verzeichnis löschen, damit Laufbalken beendet  

ende = timer
zeit = round(ende-start,3)
ie.quit

'oexec.terminate   
'do while oexec.status=0  
'	wscript.sleep 200											'Warten, sonst Laufzeitfehler  
'loop  

msgbox "Kopieren von " & nummer & " Dateien beendet!" & vbcrlf & schreibschutz & " schreibgeschützte Dateien wurden nicht übertragen." & _  
	vbcrlf & vbcrlf & liste, 0+64, "Fertig nach " & zeit & " Sekunden"  

wscript.quit		'trotzdem bleibt Prozess bestehen???, deshalb "exit function"  
oexec.terminate
exit function

end function
'#########################################################  

..und das zweite Skript "c:\Laufbalken.vbs"
'LAUFBALKEN#################################################  
Option Explicit

dim ieFort, zahl, fso

set fso = wscript.CreateObject("Scripting.FileSystemObject")									'open file-scripting  

set ieFort = wscript.createobject("InternetExplorer.Application", "event_")							'Internet Explorer für Ablauf  
ieFort.navigate ("javascript:'<title>In Arbeit...</title><body scroll=no>gestartet</body>'")  
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"  

do while (fso.folderexists("c:\temp\XYZSaveStatusABC\"))					'Darf ich weitermachen?  
	zahl = zahl +1
	wscript.sleep 100
	ieFort.document.body.innerhtml = zahl
loop
iefort.quit
wscript.quit

'#########################################################  

[Edit] Formatierung auf gesetzt. Biber
[/Edit]
Member: Biber
Biber Aug 23, 2006 at 22:25:08 (UTC)
Goto Top
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:
'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
..ä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.
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
Member: cim
cim Sep 18, 2006 at 10:49:20 (UTC)
Goto Top
Hallo,
entschuldige, dass ich mich nicht gemeldet habe.
War im Urlaub und habe jetzt Arbeit bis zum Hals.
So bald ich dazu komme, probiere ich Deine Lösung und melde mich.
Danke und schöne Grüße!