2

У меня есть пакетный файл для 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 ""

2 ответа2

4

PowerShell не имеет встроенных функций для эмуляции нажатий клавиш.

Практически у вас есть два варианта: COM-Automation и Interop.

  1. SendKeys через COM

Как и в 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('~')

Некоторые нажатия клавиш имеют специальные переменные, такие как ~ для возврата. Вот полный список.
После активации окна часто необходимо подождать секунду, пока оно не станет отзывчивым, в противном случае оно отправит ключ в окно PowerShell или в никуда. Метод SendKeys хоста сценариев может быть ненадежным, но, к счастью, есть лучший подход.

  1. SendKeys через Interop

Как и в C #, вы можете использовать метод SendWait из .NET Framework в PowerShell.

[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 приведет к отправке пароля в это другое окно в виде простого текста (например, вашего любимого мессенджера)!

0

Я внес некоторые изменения в сценарий, у меня есть список IP-серверов с одинаковым паролем, и я хочу автоматически подключиться к списку telnet и sendKey для деактивации или активации FTP-сервера.

мой сценарий:

  ## - 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
     }

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .