web-dev-qa-db-ja.com

PowershellのSendKeysメソッド

サーバーに自動的にTelnetするためのバッチファイルがあります。PowerShellでも同じことをしたいのですが。

Script.batという名前のバッチファイル:

:: Open a Telnet window
 start telnet.exe 10.84.10.85
:: Run the script
 cscript SendKeys.vbs

SendKeys.vbsという名前のコマンドファイル:

set OBJECT=WScript.CreateObject("WScript.Shell")
 WScript.sleep 1000
 OBJECT.SendKeys "myPassword{ENTER}"
 WScript.sleep 1000
 OBJECT.SendKeys "7{ENTER}"
 WScript.sleep 1000
 OBJECT.SendKeys "1{ENTER}"
 WScript.sleep 1000
 OBJECT.SendKeys "{ENTER}"
 WScript.sleep 1000
 OBJECT.SendKeys "{ENTER}"
 WScript.sleep 1000
 OBJECT.SendKeys "Y{ENTER}"
 WScript.sleep 3000
 OBJECT.SendKeys ""
4
yazan

PowerShellには、キーストロークをエミュレートする組み込み機能がありません。

実際には、COM-AutomationとInteropの2つのオプションがあります。

  1. COM経由のSendKeys

VB(S)と同様に、Shell-ObjectとSendKeysを作成できます。これを行うPowerShellの方法を次に示します。

$wshell = New-Object -ComObject wscript.Shell;
$wshell.SendKeys('a')

キーストロークをウィンドウに送信したい場合は、まずそれをアクティブにする必要があります。

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

一部のキーストロークには、RETURNの〜などの特別な変数があります。 ここ は完全なリストです。
ウィンドウをアクティブ化した後、応答するまで1秒待つことが必要になることがよくあります。そうしないと、キーがPowerShellウィンドウに送信されるか、どこにも送信されません。スクリプティングホストのSendKeysメソッドは信頼できない可能性がありますが、幸い、より良い方法があります。

  1. Interop経由のSendKeys

C#と同様に、PowerShellで.NET Frameworkの SendWait メソッドを使用できます。

[void] [System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")
[System.Windows.Forms.SendKeys]::SendWait("x")

ウィンドウをアクティブにしたい場合は、次のように実行できます。

[void] [System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
[Microsoft.VisualBasic.Interaction]::AppActivate("Internet Explorer - Windows")

スリープするには、 Start-Sleep コマンドレットを使用できます。

あなたの元の問題に関して、私は次の解決策を提案します:

# Open a Telnet window
Start-Process telnet.exe -ArgumentList 10.84.10.85
# Run the keystrokes
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.SendKeys]::SendWait('myPassword{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('7{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('1{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('Y{ENTER}')
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait('')

警告:このメソッドを使用してパスワードを送信する場合は、AppActivateの呼び出しとSendKeysの呼び出しの間に別のウィンドウをアクティブにすると、パスワードがプレーンテキストでその別のウィンドウに送信されるため、特に注意してくださいテキスト(お気に入りのメッセンジャーなど)!

9
wp78de

スクリプトにいくつかの変更を加えました。同じパスワードを持つIPサーバーのリストがあり、そのリストを自動的にTelnetで送信し、FTPサーバーを非アクティブ化またはアクティブ化するためにsendKeyを使用します。

私のスクリプトは:

  ## - List of IP
  $printers = get-content "C:\Dir2\servers.txt"

  foreach ($IPAddress in $printers){

   ## - Start Telnet Session:
     start-process C:\Windows\System32\telnet.exe -argumentlist $IPAddress

   ## - SendKey for each IP
     $obj = New-Object -com Wscript.Shell
     sleep -s 3
     $obj.SendKeys("MyPassword{ENTER}")
     sleep -s 3
     $obj.SendKeys("7{ENTER}")
     sleep -s 3
     $obj.SendKeys("1{ENTER}")
     sleep -s 3
     $obj.SendKeys("{ENTER}")
     sleep -s 3
     $obj.SendKeys("{ENTER}")
     sleep -s 3
     $obj.SendKeys("Y{ENTER}")
     sleep -s 3
     $obj.SendKeys("{ENTER}")
     sleep -s 3
     }
0
yazan