wake-up-neo.com

Wie wird ein Tastendruck in der PowerShell ausgeführt?

Ich habe ps1-Skript, um einige Informationen aus der VMware-Cluster-Umgebung abzurufen.

An einigen Stellen des ps1-Skripts muss die Taste [~ # ~] [~ # ~] eingeben gedrückt werden.

Also, wie geht das?

-Vielen Dank

28

Wenn ich das richtig verstehe, soll PowerShell den [~ # ~] Eingabetastenanschlag [~ # ~] an eine interaktive Anwendung senden?

$wshell = New-Object -ComObject wscript.Shell;
$wshell.AppActivate('title of the application window')
Sleep 1
$wshell.SendKeys('~')

Wenn es sich bei dieser interaktiven Anwendung um ein PowerShell-Skript handelt, verwenden Sie einfach die Angaben in der Titelleiste des PowerShell-Fensters als Argument für AppActivate (standardmäßig den Pfad zu powershell.exe). Um Unklarheiten zu vermeiden, können Sie Ihr Skript ein eigenes Fenster mit einem neuen Titel versehen, indem Sie title 'new window title' Befehl.

Ein paar Anmerkungen:

  • Die Tilde (~) repräsentiert den [~ # ~] Eingabetastenanschlag [~ # ~] . Sie können auch {ENTER}, obwohl sie nicht identisch sind - das ist die Tastatureingabe [~ # ~] [~ # ~] . Eine vollständige Liste finden Sie hier: http://msdn.Microsoft.com/en-us/library/office/aa202943%28v=office.10%29.aspx .
  • Der Grund für die Sleep 1 Die Anweisung wartet 1 Sekunde, da es einen Moment dauert, bis das Fenster aktiviert wird. Wenn Sie SendKeys sofort aufrufen, werden die Schlüssel an das PowerShell-Fenster gesendet, oder ins Nirgendwo.
  • Beachten Sie, dass dies ausgelöst werden kann, wenn Sie während der Wartezeit etwas eingeben oder mit der Maus klicken, um zu verhindern, dass das Fenster, das Sie mit AppActivate aktivieren, aktiv wird. Sie können experimentieren, indem Sie die Zeit reduzieren, um das Minimum zu finden, das auf Ihrem System zuverlässig ausreicht ( Sleep akzeptiert Dezimalzahlen, Sie können also 0,5 für eine halbe Sekunde versuchen). Ich stelle fest, dass bei meinem 2,6-GHz-Core-i7-Win7-Laptop weniger als 0,8 Sekunden eine erhebliche Ausfallrate haben. Ich benutze 1 Sekunde, um in Sicherheit zu sein.
  • WICHTIGE WARNUNG: Seien Sie besonders vorsichtig, wenn Sie diese Methode zum Senden eines Kennworts verwenden, da zwischen dem Aufrufen ein anderes Fenster aktiviert wird AppActivate und das Aufrufen von SendKeys bewirken, dass das Passwort im Klartext an dieses andere Fenster gesendet wird !

Manchmal kann die SendKeys -Methode von wscript.Shell etwas schrullig sein. Wenn Sie also auf Probleme stoßen, ersetzen Sie die vierte Zeile oben mit diesem:

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.SendKeys]::SendWait('~');
40
Adi Inbar