Supportnet Computer
Planet of Tech

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:

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

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

Antwort 4 von Massaraksch

Unter diesem Gesichtspunkt hast du natürlich recht.
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!

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

:)

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!

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

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.

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!

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:

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:

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 ;-).

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:

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

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: