Как выполнить нажатие клавиш внутри 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")

Для подключения к удаленному рабочему столу после аутентификации по имени пользователя и паролю запрашивается предупреждающее сообщение в соответствии с политикой компании, команда ввода не принимается, как дать ей согласие