web-dev-qa-db-ja.com

PowerShell内でキーストロークを実行する方法は?

VMwareクラスター環境からいくつかの情報を取得するps1スクリプトがあります。

Ps1スクリプトのある場所では、[〜#〜] enter [〜#〜]ボタンのキーストロークが必要です。

だから、それを行う方法は?

-ありがとう

28

正しく理解できれば、PowerShellで[〜#〜] enter [〜#〜]キーストロークを対話型アプリケーションに送信する必要がありますか?

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

その対話型アプリケーションがPowerShellスクリプトの場合、PowerShellウィンドウのタイトルバーにあるものをAppActivate(デフォルトではpowershell.exeへのパス)の引数として使用します。あいまいさを避けるために、title 'new window title'コマンドを使用して、スクリプトに独自のウィンドウのタイトルを変更させることができます。

いくつかのメモ:

  • チルダ(〜)は、[〜#〜] enter [〜#〜]キーストロークを表します。 {ENTER}を使用することもできますが、それらは同一ではありません-それはキーパッドの[〜#〜] enter [〜#〜]キーです。完全なリストはこちらから入手できます: http://msdn.Microsoft.com/en-us/library/office/aa202943%28v=office.10%29.aspx
  • Sleep 1ステートメントの理由は、ウィンドウがアクティブになるまで少し時間がかかるため1秒待つことです。また、SendKeysをすぐに呼び出すと、キーがPowerShellウィンドウに送信されます。 、またはどこにも。
  • 待機中に何かを入力するかマウスをクリックすると、AppActivateでアクティブになっているウィンドウがアクティブにならないように、これが作動する可能性があることに注意してください。システムで信頼できる十分な最小値を見つけるために、時間を減らして実験することができます(Sleepは小数を受け入れるため、0.5秒間0.5を試すことができます)。 2.6 GHz Core i7 Win7ラップトップでは、.8秒未満のエラー率が非常に高いことがわかりました。安全のために1秒を使用しています。
  • 重要な警告:この方法を使用してパスワードを送信する場合は、別のウィンドウをアクティブにするため、特に注意してくださいAppActivateを呼び出し、SendKeysを呼び出すと、パスワードが別のウィンドウにプレーンテキストで送信されます!

wscript.ShellSendKeysメソッドは少し風変わりな場合があるため、問題が発生した場合は、上記の4行目を次のように置き換えてください。

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