Как выполнить нажатие клавиш внутри powershell?
У меня есть скрипт ps1 для получения некоторой информации из кластерной среды vmware.
В каком-то месте скрипта ps1 требуется нажатие клавиши ENTER.
Итак, как это сделать?
-Спасибо
5 ответов
Если я правильно понимаю, вы хотите, чтобы PowerShell отправлял нажатие клавиши ВВОД в какое-либо интерактивное приложение?
$wshell = New-Object -ComObject wscript.shell;
$wshell.AppActivate('title of the application window')
Sleep 1
$wshell.SendKeys('~')
Если это интерактивное приложение представляет собой сценарий PowerShell, просто используйте все, что находится в строке заголовка окна PowerShell, в качестве аргумента для AppActivate (по умолчанию это путь к powershell.exe). Чтобы избежать двусмысленности, ваш скрипт может переименовывать свое собственное окно, используя title 'new window title'
команда.
Несколько заметок:
- Тильда (~) обозначает нажатие клавиши ВВОД. Вы также можете использовать
{ENTER}
хотя они не идентичны - это клавиша ENTER на клавиатуре. Полный список доступен здесь: http://msdn.microsoft.com/en-us/library/office/aa202943%28v=office.10%29.aspx. - Причина для
Sleep 1
оператор должен ждать 1 секунду, потому что для активации окна требуется время, и если вы немедленно вызываете SendKeys, он отправляет ключи в окно PowerShell или в никуда. - Имейте в виду, что это может быть отключено, если вы наберете что-нибудь или нажмете кнопку мыши в течение секунды, в течение которой он ожидает, что не позволит активировать окно, активируемое с помощью AppActivate. Вы можете поэкспериментировать с уменьшением количества времени, чтобы найти минимум, который достаточно надежен в вашей системе (Sleep принимает десятичные дроби, поэтому вы можете попробовать 0,5 в течение полсекунды). Я обнаружил, что на моем ноутбуке Core i7 Win7 с тактовой частотой 2,6 ГГц частота отказов менее 0,8 секунды значительно выше. Я использую 1 секунду, чтобы быть в безопасности.
- ВАЖНОЕ ПРЕДУПРЕЖДЕНИЕ: будьте особенно осторожны, если вы используете этот метод для отправки пароля, потому что активация другого окна между вызовом AppActivate и вызовом SendKeys приведет к тому, что пароль будет отправлен в это другое окно в виде простого текста!
Иногда метод SendKeys в wscript.shell может быть немного странным, поэтому, если у вас возникнут проблемы, замените четвертую строку выше на следующую:
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.SendKeys]::SendWait('~');
function Do-SendKeys {
param (
$SENDKEYS,
$WINDOWTITLE
)
$wshell = New-Object -ComObject wscript.shell;
IF ($WINDOWTITLE) {$wshell.AppActivate($WINDOWTITLE)}
Sleep 1
IF ($SENDKEYS) {$wshell.SendKeys($SENDKEYS)}
}
Do-SendKeys -WINDOWTITLE Print -SENDKEYS '{TAB}{TAB}'
Do-SendKeys -WINDOWTITLE Print
Do-SendKeys -SENDKEYS '%{f4}'
Отправьте клавишу «Ввод» в приложение, например, для нажатия «ОК». Прекрасно работает:
Add-Type -AssemblyName microsoft.VisualBasic
Add-Type -AssemblyName System.Windows.Forms
# Получить нужный процесс:
$ProcessName = Get-Process -Name Calculator
Старт-Сон-Секунды 1
# Если процесс действительно запущен, выведите его на передний план:
If ($ProcessName)
{
(New-Object -ComObject.Wscript.Shell).AppActivate((Get-Process $ProcessName -ErrorAction SilentlyContinue).MainWindowTitle)
}
# Отправьте клавишу «Enter» в приложение:
[Microsoft.VisualBasic.Interaction]::AppActivate($ProcessName.ProcessName)
[System.Windows.Forms.SendKeys]::SendWait({'~'})
Так же $wshell = New-Object -ComObject wscript.shell;
помог скрипту, который работал в фоновом режиме, он отлично работал, просто добавив $wshell
. исправлена работа в фоновом режиме![Microsoft.VisualBasic.Interaction]::AppActivate("App Name")
Для подключения к удаленному рабочему столу после аутентификации по имени пользователя и паролю запрашивается предупреждающее сообщение в соответствии с политикой компании, команда ввода не принимается, как дать ей согласие