Powershell: Automatische Anwendungssteuerung

Ausgangspunkt für diesen Artikel ist ein Skript, welches ich zur automatischen Steuerung einer Branchensoftware gebastelt habe. Da dies auf einem Industrie-PC läuft, auf dem ein vom Softwarehersteller modifiziertes Windows werkelt, wollte ich möglichst nur mit Bordmitteln ans Ziel. Auch wenn ich mich gerne mal wieder mit AutoIt beschäftigen würde, was ich in einer frühen Form vor Jahren mal angetestet habe, bin ich deshalb lieber bei der bereits vorhandenen Powershell geblieben.

Nur mit der Powershell habe ich es nicht hinbekommen etwas an die Anwendungen weiterzugeben und diese aktiv in den Vordergrund zu holen, deshalb habe ich folgendes aus VisualBasic eingebunden:

 

Mit folgendem Code kann man nun das Fenster einer offenen Anwendung anhand derer Prozess-ID auswählen und aktivieren und im Anschluss sendet man eine Tastatureingabe:

 

Das Ergebnis sieht dann wie folgt aus. In das in den Vordergrund geholte Editor-Fenster wurde der Buchstabe A geschrieben:

Aus irgendeinem Grund funktioniert der Wechsel zum gewünschten Fenster nur nicht, wenn vorher das Fenster der Powershell ISE als letztes aktives Fenster ausgewählt war.
Es gibt einige Berichte vom instabilen Arbeiten des „AppActivate“-Befehls, allerdings habe ich dies nur im beschriebenen eben Fall feststellen können. Da das Skript nachher sowieso als geplanter Task ausgeführt wird und nicht in der ISE, ist dies zumindest für mein Skript zu vernachlässigen.

Nun gibt es allerdings ein Problem, wenn eine Meldung bestätigt werden muss und dafür der Titel des Fensters der Meldung erkannt werden muss. Mit den Powershell-Befehlen dafür funktionierte dies leider nicht sehr zuverlässig.

Hierfür habe ich einen wirklich astreinen C#-Code gefunden, den man im Powershell-Skript ebenfalls einbinden kann:

Leider finde ich gerade den Blog- / Forumseintrag wo ich diesen her habe nicht mehr…

 

Nun steht der Verwendung von Schleifen und Abfragen nichts mehr im Weg, um komplexere Szenarien zu automatisieren. Für meinen Zweck muss eine Anwendung wieder zurück ins Start-Fenster, wenn die Benutzer vergessen haben eine Eingabemaske zu verlassen, weil nur dadurch alle eingegebenen Daten an ein anderes System zurückgegeben werden.

Da das Startfenster ein eigener Prozess ist, der beim Verlassen der Eingabemaske wieder gestartet wird, bietet es sich an mit einer Schleife zu arbeiten, die solange läuft bis der Prozess des Start-Fensters gestartet wurde. Denn dann wurde die Eingabemaske auf jeden Fall verlassen.

Welches Fenster bzw. welche Meldung im Vordergrund ist, lässt sich mit If-Abfragen in Kombination mit der C#-Funktion einfach herausfinden und kann dann mit entsprechend simulierten Tastenbefehlen bedient werden.

Das fertige Skript sieht bei mir nun so aus:

 

Als Alternative habe ich noch ein Snapin für Powershell gefunden, das sogenannte „Windows Automation Snapin for PowerShell“, kurz WASP. Damit habe ich mich aber nicht weiter beschäftigt, da es bei meinen ersten Tests nicht auf Anhieb funktionierte und ich schon mit den anderen Lösungsvorschlägen gut voran kam.

 

Tobias Langner
Ich arbeite seit mehreren Jahren als IT-Administrator, bin ausgebildeter Fachinformatiker für Systemintegration und Studium-„Pausierer“ an der FernUni Hagen

Achtung: Für die Richtigkeit der zur Verfügung gestellten Informationen, Skripte, etc. übernehme ich keine Gewähr. Deren Nutzung geschieht ausdrücklich auf eigene Gefahr!

Schreibe einen Kommentar