サーバーに自動的に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 ""
PowerShellには、キーストロークをエミュレートする組み込み機能がありません。
実際には、COM-AutomationとInteropの2つのオプションがあります。
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メソッドは信頼できない可能性がありますが、幸い、より良い方法があります。
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
の呼び出しの間に別のウィンドウをアクティブにすると、パスワードがプレーンテキストでその別のウィンドウに送信されるため、特に注意してくださいテキスト(お気に入りのメッセンジャーなど)!
スクリプトにいくつかの変更を加えました。同じパスワードを持つ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
}