Supportnet / Forum / Skripte(PHP,ASP,Perl...)
VBS: Programme nacheinander ausführen
Frage
Hallo zusammen,
ich hoffe dass mir jemand den entscheidenden Tipp geben kann, denn ich suche ein Kommando mit dem ich mehrere Programme hintereinander ausführen kann (Batch - Modus).
Dabei soll das nächste Programm erst dann loslegen, wenn das vorherige beednet ist.
Meine Intension liegt darin, mehrere Windows XP - Patches unbeaufsichtigt zu installieren. Ich hab schon an die Methode "WScript.Sleep" gedacht, aber ich weiß ja nicht wie lange jetzt ein Patch sich installiert. Hier mein bisheriges "Kustwerk":
'Echo-Methode
Option Explicit
Dim text
Dim text2
text=" Auf Ihrem PC werden jetzt einige Sicherheitspatches installiert!" 'Text definieren
text2=" Der PC startet nach diesem Vorgang neu!"
WScript.Echo " ACHTUNG!", vbCrLf & text, vbCrLf & text2, vbCrLf, "Bitte beenden Sie alle Anwendungen und sichern Sie Ihre offenen Dokumente!"
'Installation Patch 1
DIM WshShell
Set WshShell = WScript.CreateObject ("WScript.Shell")
WshShell.Run "%Windir%\ptach1.exe", 1
'Installation Patch 2
WScript.Sleep 60000
DIM WshShell1
Set WshShell = WScript.CreateObject ("WScript.Shell")
WshShell.Run "%Windir%\patch2.exe", 1
WScript.Quit
Danke schon mal im Vorraus
Antwort 1 von robbie17
ersetze dieses zeile:
durch diese:
der parameter true läßt das skript auf die
beendigung des programmstarts warten
dabei muß proforma der rückgabewert abgefragt werden
weil es sonst eine fehlermeldung geben kann (bug!)
WshShell.Run "%Windir%\ptach1.exe", 1
durch diese:
return=WshShell.Run("%Windir%\ptach1.exe", 1, true)
der parameter true läßt das skript auf die
beendigung des programmstarts warten
dabei muß proforma der rückgabewert abgefragt werden
weil es sonst eine fehlermeldung geben kann (bug!)
Antwort 2 von Massaraksch
Wieso is'n das'n Bug?
In meinen Augen ist das eigentlich normal, daß man einen Rückgabewert auch zuweist.
Er kann aber auch schreiben:
WshShell.Run "%Windir%\ptach1.exe", 1, true
Da gibt es keinen Rückgabewert.
Massaraksch
In meinen Augen ist das eigentlich normal, daß man einen Rückgabewert auch zuweist.
Er kann aber auch schreiben:
WshShell.Run "%Windir%\ptach1.exe", 1, true
Da gibt es keinen Rückgabewert.
Massaraksch
Antwort 3 von robbie17
@Massaraksch
deine variante sollte eigentlich funktionieren
bei manchen versionen des wsh tut sie es aber nicht
da kommt dann eine fehlermeldung
genau das ist der bug!
dies tritt aber nur mit true als 3. parameter auf
deine variante sollte eigentlich funktionieren
bei manchen versionen des wsh tut sie es aber nicht
da kommt dann eine fehlermeldung
genau das ist der bug!
dies tritt aber nur mit true als 3. parameter auf
Antwort 4 von Massaraksch
Unter diesem Gesichtspunkt hast du natürlich recht.
Habe die letzte Version (5.6) und damit funktioniert es.
Massaraksch
Habe die letzte Version (5.6) und damit funktioniert es.
Massaraksch
Antwort 5 von [Rocco]
Hallo Jungs,
nicht nötig, dass ich ihr euch wegen mir streitet ;-).
Also ich hab jetzt mal beide Methoden ausprobiert und leider hat die von robbie17 nicht funtioniert. Fehlermeldung: Variable "return" nicht definiert.
Die Idee von Massaraksch hat direkt gefruchtet und deshalb bin ich dabei verblieben. Hab keine Lust gehabt mich noch einem Lehrgang in Variablen-Definitionen zu unterziehen, da ich auf diesem Gebiet ein absoluter Newbie bin ;-).
Trotzdem; Danke! Ihr habt mir sehr geholfen!
nicht nötig, dass ich ihr euch wegen mir streitet ;-).
Also ich hab jetzt mal beide Methoden ausprobiert und leider hat die von robbie17 nicht funtioniert. Fehlermeldung: Variable "return" nicht definiert.
Die Idee von Massaraksch hat direkt gefruchtet und deshalb bin ich dabei verblieben. Hab keine Lust gehabt mich noch einem Lehrgang in Variablen-Definitionen zu unterziehen, da ich auf diesem Gebiet ein absoluter Newbie bin ;-).
Trotzdem; Danke! Ihr habt mir sehr geholfen!
Antwort 6 von robbie17
@[Rocco]
wenn du ein newbie bleiben willst
kann ich das akzeptieren
aber dann ist es meine heilige pflicht
dich dringend und absolut davor zu warnen
hier draufzuklicken
:)
wenn du ein newbie bleiben willst
kann ich das akzeptieren
aber dann ist es meine heilige pflicht
dich dringend und absolut davor zu warnen
hier draufzuklicken
:)
Antwort 7 von [Rocco]
Oh Mann, noch geheimnisvoller hätte es ja nicht sein können, nicht wahr robbie?
Ich habs gesaugt und naja.....es ist doch etwas mehr als eine Gute-Nacht-Lektüre...nee, Scherz. Super, das ist echt hilfreich. Jetzt kann ich erst recht loslegen und Profi-Scripte zaubern. ;-)
Vielen Dank!
Ich habs gesaugt und naja.....es ist doch etwas mehr als eine Gute-Nacht-Lektüre...nee, Scherz. Super, das ist echt hilfreich. Jetzt kann ich erst recht loslegen und Profi-Scripte zaubern. ;-)
Vielen Dank!
Antwort 8 von Massaraksch
Nur noch als Hinweis:
Die Fehlermeldung (Variable nicht definiert) verhinderst du, indem du
a) die Variable ganz einfach mit "dim return" am Anfang definierst
(du hast doch auch schon andere Variablen definiert, z.B. text, text2, deshalb verstehe ich eigentlich deine Frage zu der Fehlermeldung nicht ganz)
oder
b) die Anweisung "Option Explicit" entfernst
(dann brauchst du keinerlei Variablen mehr zu definieren, ist aber eigentlich "schlechter Stil" ;-)
Und die von Robbie17 verlinkte Winscript-Doku ist sehr empfehlenswert ;-)
Massaraksch
Die Fehlermeldung (Variable nicht definiert) verhinderst du, indem du
a) die Variable ganz einfach mit "dim return" am Anfang definierst
(du hast doch auch schon andere Variablen definiert, z.B. text, text2, deshalb verstehe ich eigentlich deine Frage zu der Fehlermeldung nicht ganz)
oder
b) die Anweisung "Option Explicit" entfernst
(dann brauchst du keinerlei Variablen mehr zu definieren, ist aber eigentlich "schlechter Stil" ;-)
Und die von Robbie17 verlinkte Winscript-Doku ist sehr empfehlenswert ;-)
Massaraksch
Antwort 9 von [Rocco]
@Massaraksch:
Ach [ZENS] sorry ich bin einfach noch nicht so im Thema "Programmieren" und da bringe ich schnell was durcheinander. Stimmt hast Recht, die Deklaration habe ich oben schon mal gemacht. Das ist mir auch, nachdem ich hier diesen Thread erstellt habe, aufgefallen. Naja, egal...
Ja, die Doku ist echt super, damit konnte ich schon ein weiteres Problem lösen, was im Laufe der Scripterei enstanden ist.
Ach [ZENS] sorry ich bin einfach noch nicht so im Thema "Programmieren" und da bringe ich schnell was durcheinander. Stimmt hast Recht, die Deklaration habe ich oben schon mal gemacht. Das ist mir auch, nachdem ich hier diesen Thread erstellt habe, aufgefallen. Naja, egal...
Ja, die Doku ist echt super, damit konnte ich schon ein weiteres Problem lösen, was im Laufe der Scripterei enstanden ist.
Antwort 10 von [Rocco]
Ach Jungs,
ich hab da noch eine winzige Frage: ist es möglich für mein Script sowas ähnliches wie eine "Statusanzeige" einzubauen? Also die Patchinstalltion läuft super, nur ich würde da noch so ein Fenster einbauen wollen, was zumindest zählt (z.B.: Momentan wird Patch 3/9 installiert), wieviele Patches noch installiert werden....oder geht das jetzt über die Möglichkeiten des VBS hinaus? ;-)
Danke im Vorraus!
ich hab da noch eine winzige Frage: ist es möglich für mein Script sowas ähnliches wie eine "Statusanzeige" einzubauen? Also die Patchinstalltion läuft super, nur ich würde da noch so ein Fenster einbauen wollen, was zumindest zählt (z.B.: Momentan wird Patch 3/9 installiert), wieviele Patches noch installiert werden....oder geht das jetzt über die Möglichkeiten des VBS hinaus? ;-)
Danke im Vorraus!
Antwort 11 von robbie17
du kannst dein skript in der konsole starten
dann hast du die möglichkeit meldungen auszugeben
ohne daß das skript angehalten wird
aufruf: cscript <scriptname.vbs>
beispiel:
dann hast du die möglichkeit meldungen auszugeben
ohne daß das skript angehalten wird
aufruf: cscript <scriptname.vbs>
beispiel:
set i=wscript.stdin
set o=wscript.stdout
for n=1 to 10
o.writeline n
next
o.write "press <RETURN>"
egal=i.readline
Antwort 12 von robbie17
oder probier mal so
dann kannst du es auch per doppelklick starten:
ich hoffe der cmd-aufruf funktioniert
denn den kann ich grade nicht testen
dann kannst du es auch per doppelklick starten:
set fso=createobject("scripting.filesystemobject")
set wshshell=createobject("wscript.shell")
if lcase(fso.getfilename(wscript.fullname))="wscript.exe" then
wshshell.run "cmd /k cscript"&space(1)&wscript.scriptfullname
wscript.quit
end if
set i=wscript.stdin
set o=wscript.stdout
for n=1 to 10
o.writeline n
next
o.write "press <return>"
egal=i.readline
ich hoffe der cmd-aufruf funktioniert
denn den kann ich grade nicht testen
Antwort 13 von [Rocco]
Uff, naja sieht zumindest vielversprechend aus ;-). An welcher Stelle muss ich das Script einbauen? Ich hab die Struktur beibehalten, so wie ich es in der Frage aufgeführt habe.
Muss das an den Anfang? Oder nach jeder Patchausführung?
Sorry, aber wie ihr seht, verstehe ich das leider noch nicht so ganz ;-).
Muss das an den Anfang? Oder nach jeder Patchausführung?
Sorry, aber wie ihr seht, verstehe ich das leider noch nicht so ganz ;-).
Antwort 14 von robbie17
das skript ist nicht so kompliziert
wie es vielleicht aussieht
über wscript.fullname kann man erfahren
wie die datei heißt von der das skript ausgeführt wird
der name kommt mit dem vollständigen pfad
den kann man mit fso.getfilename entfernen
in dem if-block fragt das skript ob diese datei wscript.exe heißt
es gibt da zwei möglichkeiten:
wscript.exe: dann wurde das skript unter windows gestartet
cscript.exe: dann wurde das skript in der konsole gestartet
wenn das skript also merkt daß es unter windows gestartet wurde
beendet es sich und ruft sich vorher noch selbst über die konsole auf
nach dem if-block steht also fest daß man sich in der konsole befindet
dann kann man die objekte zum lesen und schreiben (stdin/stdout) erzeugen
unter windows käme sonst nämlich eine fehlermeldung
jetzt kannst du deinen skriptinhalt anhängen
ob du die meldungen die vom benutzer quittiert werden sollen
als meldungsfenster ausgibst oder in die konsole schreibst ist geschmackssache
variante 1:
variante 2:
übrigens:
wenn du ein objekt wie zb wshshell erzeugst
kannst du es danach so oft benutzen wie du willst
du mußt es nicht jedesmal neu erzeugen
wie es vielleicht aussieht
über wscript.fullname kann man erfahren
wie die datei heißt von der das skript ausgeführt wird
der name kommt mit dem vollständigen pfad
den kann man mit fso.getfilename entfernen
in dem if-block fragt das skript ob diese datei wscript.exe heißt
es gibt da zwei möglichkeiten:
wscript.exe: dann wurde das skript unter windows gestartet
cscript.exe: dann wurde das skript in der konsole gestartet
wenn das skript also merkt daß es unter windows gestartet wurde
beendet es sich und ruft sich vorher noch selbst über die konsole auf
nach dem if-block steht also fest daß man sich in der konsole befindet
dann kann man die objekte zum lesen und schreiben (stdin/stdout) erzeugen
unter windows käme sonst nämlich eine fehlermeldung
jetzt kannst du deinen skriptinhalt anhängen
ob du die meldungen die vom benutzer quittiert werden sollen
als meldungsfenster ausgibst oder in die konsole schreibst ist geschmackssache
variante 1:
set fso=createobject("scripting.filesystemobject")
set wshshell=createobject("wscript.shell")
if lcase(fso.getfilename(wscript.fullname))="wscript.exe" then
wshshell.run "cmd /k cscript"&space(1)&wscript.scriptfullname
wscript.quit
end if
set i=wscript.stdin
set o=wscript.stdout
msgbox "es werden patches installiert!"
msgbox "der rechner kann dabei explodieren!"
o.writeline "hier kommt patch 1"
'run patch
o.writeline "hier kommt patch 2"
'run patch
msgbox "fertig!"
variante 2:
set fso=createobject("scripting.filesystemobject")
set wshshell=createobject("wscript.shell")
if lcase(fso.getfilename(wscript.fullname))="wscript.exe" then
wshshell.run "cmd /k cscript"&space(1)&wscript.scriptfullname
wscript.quit
end if
set i=wscript.stdin
set o=wscript.stdout
o.writeline "es werden patches installiert!"
o.write "weiter mit <return>"
egal=i.readline
o.writeline "der rechner kann dabei explodieren!"
o.write "weiter mit <return>"
egal=i.readline
o.writeline "hier kommt patch 1"
'run patch
o.writeline "hier kommt patch 2"
'run patch
o.writeline "fertig!"
übrigens:
wenn du ein objekt wie zb wshshell erzeugst
kannst du es danach so oft benutzen wie du willst
du mußt es nicht jedesmal neu erzeugen

