#powershell #command-line-interface #keystroke #windows-update
#powershell #интерфейс командной строки #нажатие клавиши #центр обновления Windows
Вопрос:
Сначала я должен заявить об отказе от ответственности, что я едва ли новичок, когда дело доходит до написания сценариев или кодирования, поэтому, возможно, я изначально все делаю неправильно. Я столкнулся с проблемой со скриптом, который я написал в powershell некоторое время назад, который используется на нескольких сотнях компьютеров в моей компании ежедневно для автоматизации запуска определенного приложения, которым пользуются все. До сих пор у всех остальных не возникало проблем, кроме одной машины. Обычно, когда я запускаю скрипт, он запускает службы и cli для программы, которая открывается в новом окне. Затем скрипт, все еще открытый за этим, отправляет все ключевые команды в это окно командной строки, приостанавливается для короткой строки пользовательского ввода, после чего он закрывает это окно командной строки, выполняет несколько других задач очистки и закрывается сам. Единственное отличие на этом компьютере, которое не работает, заключается в том, что скрипт не передает нажатия клавиш в окно командной строки. Если я введу их вручную, включая обычный пользовательский ввод, остальная часть скрипта будет выполнена нормально, но окно командной строки просто не получит ввод нажатия клавиши из основного скрипта. Единственная часть скрипта, которая отправляет нажатия клавиш в окно командной строки, — это несколько строк этого: [System.Windows.Forms.SendKeys]::SendWait("Text{Enter}")
Я пытался использовать команду sleep до и в промежутках между ключевыми командами, чтобы убедиться, что она не переходит от нажатий клавиш к раннему. Я проверил, и Windows прошла обновление два дня назад, но мы бы услышали об этой проблеме прямо тогда, если бы это было так. Я не понимаю, в чем может быть проблема, и был бы признателен за помощь, советы или указания, которые помогут разобраться в этом.
Комментарии:
1. трудно сказать, что происходит, когда вы не предоставляете общий доступ ко всему вашему скрипту. таким образом, мой первый вопрос таков: загрузили ли вы сборку заранее
[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
, чтобы вы могли использовать «SendKeys»?2. Я почти уверен, еще раз извините, я все еще новичок в этом, но у меня есть это в начале.
Add-Type -AssemblyName System.Windows.Forms -ErrorAction Stop
И, как я упоминал ранее, он может использовать SendKeys на всех других компьютерах, так что, возможно, по какой-то причине возникнет проблема с вызовом этой команды?3. Я просто действительно сбит с толку, поскольку единственная машина, с которой у нее возникла проблема, — это 1 из нескольких сотен, которые практически являются точной копией друг друга, поэтому было трудно найти различия, которые могли бы вызвать эту проблему. Я не уверен, возникает ли проблема с загрузкой этой команды, чтобы иметь возможность ее использовать, или она неправильно используется в окне командной строки, или где-то проблема с разрешениями. Я не уверен, что это из-за обновления, потому что есть все остальные, которые обновлены и работают нормально.
4. итак, чтобы отладить, как правило, работает, попробуйте скрипт, подобный
Add-Type -AssemblyName System.Windows.Forms -ErrorAction Stop;Start-Process notepad;Start-Sleep -Seconds 5; [System.Windows.Forms.SendKeys]::SendWait("Text{Enter}")
, на рассматриваемой машине, чтобы посмотреть, не работает ли он вообще. Я думаю, что это может быть проблема с фокусом / синхронизацией (окно командной строки не в фокусе)5. Хорошо, просто попробовал это, и он нормально открыл notepad, но не ввел текст или нажатия клавиш в notepad, а затем закрылся и оставил окно notepad открытым. Я забыл, что пробовал что-то подобное, добавив функцию sleep непосредственно перед строками для отправки ключей, и просто поэкспериментировал, убедившись, что она определенно выбрана и может быть введена, и что прерываний не было. Но в остальном, никаких сомнений в этом нет. Было бы более вероятно, что ему не удается передать нажатие клавиши в другое окно или что он вообще не загружает команду Sendkeys?
Ответ №1:
Является ли окно консоли активным при отправке ключей? В документации к вызываемому классу указано, что он отправляет ключи в активное окно. Не только это, но и документация, похоже, указывает на некоторые проблемы, с которыми столкнулись разработчики при использовании этого класса для отправки ключей. Вместо этого я бы попробовал использовать модуль autoit powershell. Autoit — это собственный язык сценариев, который специализируется на автоматизации процессов Windows и способен автоматизировать взаимодействие с Windows forms, но также поставляется в комплекте с собственным модулем powershell, который, я думаю, именно то, что вам нужно, поэтому я бы загрузил переносимый пакет «zip», извлек модуль powershell из «Autoitx», и это должно помочь вам выполнить то, что вам нужно
Комментарии:
1. Хорошо, приятно знать, что с другими он тоже привередлив. Я пытался избежать использования любых ресурсов, которые еще не были предустановлены, поскольку это добавляет еще одну переменную для устранения неполадок, а также изначально добавлять ее к более чем 400 машинам было бы поначалу несколько более громоздким. Я мог бы обновить его сейчас, чтобы быть более надежным, используя модуль autoit, который вы предлагаете, и развернуть его более небрежно, поскольку у нас есть текущая рабочая опция. В настоящее время у меня нет возможности просто рассылать спам-обновления, поэтому я должен учитывать, сколько времени потребуется, чтобы добавить это на все компьютеры. Спасибо за помощь!
2. О, и я забыл упомянуть о вашей предыдущей мысли; да, окно консоли является активным окном, когда все отправляется. Мы столкнулись с проблемой, когда кто-то случайно прерывал его, выполняя другие действия во время его выполнения, но мы частично исправили это, отключив режим быстрого редактирования и режим вставки. Я действительно заинтересован в этом модуле и надеюсь, что это будет достаточно простое обновление.
Ответ №2:
Автоматизация PowerShell, особенно при использовании клавиш отправки, может давать сбои по многим различным причинам. Вы можете использовать SendKeys, конечно, но вы должны знать среду, в которой она будет запущена, и необходимые сведения о производительности. Следовательно, вы переходите в режим ожидания.
Для этого существуют специальные инструменты.
Автоматическая горячая клавиша
«Автоматическая горячая клавиша PowerShell»
или инструмент UIAutomation