44

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

ps1 スクリプトのある場所では、ENTERボタンのキーストロークが必要です。

それで、それを行う方法は?

-ありがとう

4

3 に答える 3

67

私の理解が正しければ、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は小数を受け入れるため、.5 を 0.5 秒試すことができます)。私の 2.6 GHz Core i7 Win7 ラップトップでは、0.8 秒未満のエラー発生率が非常に高いことがわかりました。安全のために1秒を使用します。
  • 重要な警告: この方法を使用してパスワードを送信する場合は、特に注意してください。AppActivateの呼び出しとSendKeysの呼び出しの間に別のウィンドウをアクティブにすると、パスワードがプレーン テキストで別のウィンドウに送信されるためです。

wscript.shellのSendKeysメソッドは少し風変わりな場合があるため、問題が発生した場合は、上記の 4 行目を次のように置き換えます

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.SendKeys]::SendWait('~');
于 2013-07-25T07:21:16.180 に答える
0

また、$wshell = New-Object -ComObject wscript.shell;バックグラウンドで実行されていたスクリプトを助けました。追加するだけで問題なく動作しました$wshell。バックグラウンドとして実行されないように修正しました![Microsoft.VisualBasic.Interaction]::AppActivate("App Name")

于 2020-08-12T22:53:48.567 に答える