Metoda SendKeys w PowerShell

3

Mam plik wsadowy dla serwera telnet automatycznie, chcę zrobić to samo z PowerShell

Plik wsadowy o nazwie Script.bat:

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

Plik poleceń o nazwie 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 ""
Yazan
źródło
2
start-process path\telnet.exe -argumentlist 10.84.10.85uruchomić telnet, $obj = New-Object -com Wscript.Shellstworzyć obiekt, $obj.SendKeys("x")wysłać klucze, sleep -ms 1000spać
SimonS
dokładnie tego szukam !! merci :)
yazan
@SimonS prosimy o odpowiedź na podstawie komentarza.
JosefZ

Odpowiedzi:

5

Program PowerShell nie ma wbudowanej funkcji emulacji naciśnięć klawiszy.

Praktycznie masz dwie opcje: COM-Automation i Interop.

  1. SendKeys przez COM

Podobnie jak w VB (S)) możesz stworzyć obiekt powłoki i SendKeys. Oto sposób, aby to zrobić w PowerShell.

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

Jeśli chcesz wysłać naciśnięcie klawisza do okna, musisz je najpierw aktywować:

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

Niektóre naciśnięcia klawiszy mają specjalne zmienne, takie jak ~ dla RETURN. Oto pełna lista.
Po aktywacji okna często trzeba odczekać sekundę, aż zacznie reagować, w przeciwnym razie wyśle ​​klucz do okna programu PowerShell lub do nikąd. Metoda SendKeys hosta skryptów może być zawodna, ale na szczęście istnieje lepsze podejście.

  1. SendKeys przez Interop

Podobnie jak w języku C #, możesz użyć metody SendWait z .NET Framework w PowerShell.

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

Jeśli chcesz aktywować okno, możesz to zrobić w następujący sposób:

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

Do trybu uśpienia można użyć polecenia cmdlet Start-Sleep .

Jeśli chodzi o twój pierwotny problem, proponuję następujące rozwiązanie:

# 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('')

OSTRZEŻENIE: Zachowaj szczególną ostrożność, jeśli używasz tej metody do wysłania hasła, ponieważ aktywacja innego okna między wywołaniem AppActivate a wywołaniem SendKeys spowoduje wysłanie hasła do tego innego okna zwykłym tekstem (np. Ulubionego komunikatora)!

wp78de
źródło
0

Zrobiłem trochę modyfikacji w skrypcie, mam listę serwerów IP, które mają to samo hasło i chcę automatycznie telnet listy i wysłać klucz do dezaktywacji lub aktywacji serwera FTP.

mój skrypt to:

  ## - 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
     }
Yazan
źródło