Как выполнить нажатие клавиши внутри powershell?

У меня есть скрипт ps1 для получения некоторой информации из среды кластера vmware.

В некоторых местах сценария ps1 требуется нажатие кнопки ENTER.

Итак, как это сделать?

-Спасибо


person HamTheAstroChimp    schedule 25.07.2013    source источник
comment
Какой сценарий я написал, требует нажатия клавиши ENTER. вместо того, чтобы все время нажимать кнопку enter, я просто хочу автоматизировать.   -  person HamTheAstroChimp    schedule 25.07.2013
comment
Почему требуется нажать Enter? Вы выполняете read-host?   -  person Keith Hill    schedule 25.07.2013
comment
Myscript постоянно входит/выходит из системы с нескольких компьютеров. К моменту выхода из системы требуется подтверждение, поэтому я должен нажать кнопку войти. Вот почему я хочу автоматизировать.   -  person HamTheAstroChimp    schedule 25.07.2013


Ответы (2)


Если я правильно понимаю, вы хотите, чтобы PowerShell отправлял нажатие клавиши ENTER в какое-то интерактивное приложение?

$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}, хотя они не идентичны — это клавиша 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('~');
person Adi Inbar    schedule 25.07.2013
comment
Спасибо за это дополнение Add-Type в конце. Целый час бился головой о стену, пытаясь заставить мой сценарий работать. - person sliderhouserules; 23.03.2015
comment
В чем разница между использованием Wscript.Shell и использованием SendKeys.SendWait? Один лучше другого? - person tfpf; 22.07.2021

Также $wshell = New-Object -ComObject wscript.shell; помог скрипту, который работал в фоновом режиме, он работал нормально, просто добавив $wshell. исправлено его запуск в качестве фона! [Microsoft.VisualBasic.Interaction]::AppActivate("App Name")

person overflowed56798    schedule 12.08.2020