VBScript, Programmstart und Fenster Wechsel

Amenkor

Ensign
Registriert
Okt. 2014
Beiträge
174
Hallo,

Ich brauche ein VBScript, welches verschiedene Programme startet und in gleichbleibenden Zeitabständen zwischen diesen hin und her wechselt.

Programmstart klappt. Der Wechsel leider nur unzuverlässig, mal wechselt es, mal nicht. Die Zeitabstände sind auch unterschiedlich.

Kenne mich damit nicht wirklich aus, und hab mir aus dem Netz folgendes rausgesucht:

Code:
set WshShell = WScript.CreateObject("WScript.Shell")

WScript.Timeout = 60

WshShell.Run "outlook"
WScript.Sleep 1000
WshShell.Run "chrome"
WScript.Sleep 1000
WshShell.Run "chrome"

set ws = CreateObject("Wscript.shell")

tab=1
counter=0
fenster=3
ws.run("help")

do
	counter = counter + 1
	if counter = fenster + 1 then tab=2
	ws.sendkeys "%+{TAB " & tab & "}"
	wscript.sleep 5000
	if counter = 10 then counter = 0
loop

Wäre super wenn mir jemand helfen könnte, oder Tipps hat.

Wichtig dabei wäre, dass der Browser zweimal gestartet werden muss, also in zwei fenstern, nicht nur Tabs. Und auch zwischen diesen muss gewechselt werden.

Code:
Do
	WshShell.AppActivate "chrome"
	wscript.sleep 5000
	WshShell.AppActivate "outlook"
	wscript.sleep 5000
	WshShell.AppActivate "chrome"
	wscript.sleep 5000

Loop
Funktioniert leider auch nicht, da es nicht mit den zwei Fenstern von Chrome klar kommt.

Grüße
 
Zuletzt bearbeitet:
Zeile 20: tab wird außerhalb der Schleife mit 0 initialisiert. Innerhalb der Schleife wird irgendwann tab=2 gesetzt und bleibt dann so für alle Ewigkeit. Ich weiss nicht ob du das erreichen willst, aber um tab nach einander die Werte 1, 2, 3, 1, 2, 3, ... usw. annehmen zu lassen, reicht tab = 1 + counter mod 3.

Zeile 21: in der Doku zu SendKey steht nichts davon, dass man in geschweiften Klammern etwas anderes außer die fest definierten Tasten-Codes verwenden kann. Gültig ist "{TAB}" oder "{TAB}{TAB}", aber was soll "{TAB 1}" bedeuten?

Zeile 23: du setzt counter willkürlich beim Wert 10 auf 0 zurück. Das kann nicht stimmen, wenn die drei Fenster in gleichbleibender Reihenfolge durchgeschaltet werden sollen. mod 3 bietet sich wieder an. Eine der Variablen counter oder tab kann man dann wegrationalisieren.
 
Ich bin so schlecht im Programmieren... Und dann auch noch VBScript, aber wenn Chefe sagt mach mal...

Hab vorher damit noch nie gearbeitet. Ich werd einfach weiter rumprobieren. Und mal schauen was genau du meinst.
Ergänzung ()

Dann halt noch einmal hier:

Guten Morgen,

Versuche gerade mit einem VBScript oder einem Programm (AutoTab) automatisch zwischen mehreren Tabs in gleichbleibenden Zeitabständen zu wechseln.

Jedoch sind die Zeitabstände scheinbar total willkürlich, mal 2 Sekunden, mal 5, aber auch mal 10 bis 20. Es sind zum Test 5 Sekunden eingestellt.

Wundert mich etwas, vorallem da das Problem nicht nur auf einem, sondern auf 2 Windows 10 Rechnern auftritt. Beide aktueller Patchstand.

1. Programm AutoTab - Wechsel auf 5sek Intervalle
2.

Code:
set ws = CreateObject("Wscript.shell")
 
WScript.Timeout = 120 
 
tab=1
counter=0
fenster=3
ws.run("help")
 
do
	counter = counter + 1
	if counter = fenster + 1 then tab = 1 + counter mod 3
	ws.sendkeys "%+{TAB " & tab & "}"
	wscript.sleep 3000
	if counter mod 3 then counter = 0
loop
3.
Code:
set WshShell = CreateObject("Wscript.shell")
 
WScript.Timeout = 60
 
do
	WshShell.AppActivate "chrome"
	wscript.sleep 5000
	WshShell.AppActivate "word"
	wscript.sleep 5000
loop
Weiß jemand woher diese willkürlichen Abstände und Intervalle kommen?
 
Versuch es erstmal einfacher:
Code:
do
	ws.sendkeys "%+{TAB}"
	wscript.sleep 3000
loop

Wenn {TAB 2} irgendwie sinnvoll ist, kannst du danach hiermit weiter experimentieren:
Code:
do
	tab = 1 + counter mod 3
	ws.sendkeys "%+{TAB " & tab & "}"
	wscript.sleep 3000
	counter = counter + 1
loop

Die Variableninhalte sollten sich so entwickeln:

counter012345678...
tab123123123...
 
Hey, danke. Das Script läuft jetzt soweit bis auf die unterschiedlichen Zeitintervalle.

Habe jetzt kurz mal mit folgendem Code gearbeitet:

Code:
Set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Timeout = 30
Do
    WshShell.AppActivate "Firefox"
    ' WshShell.SendKeys "% r"
    WScript.Sleep 5000
    WshShell.AppActivate "Chrome"
    ' WshShell.SendKeys "% r"
    WScript.Sleep 5000
    WshShell.AppActivate "Serviceanfrage"
    ' WshShell.SendKeys "% r"
    WScript.Sleep 5000
Loop

Ist bisher die Lösung, die für uns am besten Funktioniert, bis auf:

1. Sind zwei Instanzen von einem Browser geöffnet, also zwei Fenster, kommt das Script durcheinander...
Anhand von Prozess IDs lösbar? Weiß das jemand?

2. Das Outlook Fenster ist folgendermaßen benannt "Aktiver Ordner - Email-Adresse - Outlook"
WshShell.AppActivate "Outlook" funktioniert leider nicht. Mit Platzhaltern (*, ?, %) leider auch nicht. Und so wird wenn ich versehentlich im Ordner Posteingang und nicht Serviceanfrage bin, Outlook nicht geöffnet.
Wie muss ich das mit den Platzhaltern definieren?

Gibt es einen anderen Befehl, der diese Funktion vielleicht allgemein besser übernimmt?


Das mit den TABs senden ist zwar nett, aber echt unzuverlässig. Zumindest in der Erfahrung wie Ich es bisher gemacht habe. Die Zeitintervalle variieren zwischen 2-20 Sekunden.
Ergänzung ()

Script funktioniert. Wird jetzt mit den entsprechenden Namen gefüllt, Zeitintervalle sind nahezu identisch.

Jetzt muss ich im Script noch zwei Instanzen von Chrome öffnen, die jeweils in einem eigenen Fenster stehen und direkt eine Adresse aufrufen.

Bisheriger Ansatz:
Code:
shell.Run "chrome"
WScript.Sleep 3000
shell.Run "chrome http://www.google.de"
WScript.Sleep 2000
shell.Run "chrome"
WScript.Sleep 3000
shell.Run "chrome http://www.google.de"
WScript.Sleep 2000

Funktioniert auch, es werden zwei Chrome Fenster geöffnet und Google aufgerufen.
Problem, es wird erst ein leerer Tab geöffnet und dann ein zweiter mit Google, geht, ist aber unschön. Wenn ich Chrome starten und Google aufrufe in einen Befehl schreibe, wird kein neues Fenster aufgerufen sondern immer nur ein neuer Tab.
Ist einfach eine nicht ganz saubere Lösung und mit dem "Sleep" kann es auch gerne mal zu Fehlern kommen, wenn sich die Startzeit verzögert.

Jemand Tipps und Ideen, ich probier derweil mal weiter rum.

Grüße
Ergänzung ()

Script funktioniert. Wird jetzt mit den entsprechenden Namen gefüllt, Zeitintervalle sind nahezu identisch.

Jetzt muss ich im Script noch zwei Instanzen von Chrome öffnen, die jeweils in einem eigenen Fenster stehen und direkt eine Adresse aufrufen.

Bisheriger Ansatz:
Code:
shell.Run "chrome"
WScript.Sleep 3000
shell.Run "chrome http://www.google.de"
WScript.Sleep 2000
shell.Run "chrome"
WScript.Sleep 3000
shell.Run "chrome http://www.google.de"
WScript.Sleep 2000

Funktioniert auch, es werden zwei Chrome Fenster geöffnet und Google aufgerufen.
Problem, es wird erst ein leerer Tab geöffnet und dann ein zweiter mit Google, geht, ist aber unschön. Wenn ich Chrome starten und Google aufrufe in einen Befehl schreibe, wird kein neues Fenster aufgerufen sondern immer nur ein neuer Tab.
Ist einfach eine nicht ganz saubere Lösung und mit dem "Sleep" kann es auch gerne mal zu Fehlern kommen, wenn sich die Startzeit verzögert.

Jemand Tipps und Ideen, ich probier derweil mal weiter rum.

Grüße
Ergänzung ()

Funktioniert jetzt eigentlich alles so wie gewollt, bis auf das Öffnen eines Fensters, dass dort erst ein Neuer Tab und dann das eigentliche Fenster geöffnet wird. Naja optischer Fehler, erstmal nicht ganz so wichtig.

Code:
WScript.Timeout = 180

Dim shell
Dim WshShell

Set shell = WScript.CreateObject("WScript.Shell")
Set WshShell = WScript.CreateObject("WScript.Shell")

WScript.Sleep 1000

shell.Run "chrome.exe", 3, true
shell.Run "chrome.exe https://www.google.de", 3, true
shell.Run "chrome.exe", 3, true
shell.Run "chrome.exe https://de.wikipedia.org", 3, true
shell.Run "outlook.exe", 3, true

WScript.Sleep 10000

Do
    WshShell.AppActivate "Google"
    ' WshShell.SendKeys "% r"
    WScript.Sleep 5000
    WshShell.AppActivate "Posteingang"
    ' WshShell.SendKeys "% r"
    WScript.Sleep 5000
    WshShell.AppActivate "Wikipedia"
    ' WshShell.SendKeys "% r"
    WScript.Sleep 5000
Loop

Jetzt kam zusätzlich die Anweisung, dass das Script durch eine Tastenkombination Pausiert und wieder fortgesetzt werden soll. Dazu finde ich jetzt überhaupt nichts nützliches im Netz, außer das ich irgendetwas mit "HTA" File machen soll.

Gibt es irgendeine Möglichkeit den "Loop" zu beenden und das Scrip per Tastendruck neu zustarten?
 
Zuletzt bearbeitet:
Falls es wen interessiert:

Mit Firefox klappt es einwandfrei.

Script anhalten, fortsetzen und beenden klappt mit den PsTools (pssuspend und pskill) super.
Problem ist also gelöst.
 
Zurück
Oben