Program PowerShell nie ma wbudowanej funkcji emulacji naciśnięć klawiszy.
Praktycznie masz dwie opcje: COM-Automation i Interop.
- 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.
- 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)!
start-process path\telnet.exe -argumentlist 10.84.10.85
uruchomić telnet,$obj = New-Object -com Wscript.Shell
stworzyć obiekt,$obj.SendKeys("x")
wysłać klucze,sleep -ms 1000
spać