Вопрос по лекции 7, где рассматривается взаимодействие со сторонними программами, в том числе эмуляция нажатия кнопок клавиатуры WshShell.SendKeys. Вопрос в том что во время автоматизации может потребоваться не нажатие клавиатуры, а нажатие кнопок в сообщениях этих программ. Можно вытащить информацию о объекте (кнопке) скажем с помощью AutoIt Info, или ориентироваться скажем на текст на кнопке..., но как на эту кнопку нажать? (без обхода по клавиатуре) |
Сценарии Windows PowerShell
Сценарии Windows PowerShell
До настоящего момента мы работали в оболочке PowerShell интерактивно, вводя команды и получая результат их выполнения. Перейдем теперь к рассмотрению сценариев, поддержка которых реализована в PowerShell в полной мере – от самых простых до очень сложных.
Сценарии PowerShell представляют собой текстовые файлы с расширением ps1, в которых записаны команды, операторы и другие конструкции языка PowerShell. В отличие от сценариев WSH и командных файлов интерпретатора Cmd.exe, сценарии PowerShell можно писать поэтапно, непосредственно в самой оболочке, перенося затем готовый код во внешний текстовый файл. Такой подход значительно упрощает изучение языка и отладку сценариев, так как можно сразу видеть результат выполнения отдельных частей сценария.
Как правило, при создании более-менее сложных сценариев возникает необходимость в управлении ходом выполнения программы. Для этого в языке PowerShell, как и в любом алгоритмическом языке, предусмотрены специальные инструкции.
Управляющие инструкции языка PowerShell
В языке PowerShell имеются элементы, позволяющие выполнить логическое сравнение и предпринять различные действия в зависимости от его результата, или дающие возможность повторять одну или несколько команд снова и снова.
Инструкция If … Elseif … Else
Логические сравнения лежат в основе практически всех алгоритмических языков программирования. В PowerShell при помощи инструкции If можно выполнять определенные блоки кода только в том случае, когда заданное условие имеет значение True (истина). Также можно задать одно или несколько дополнительных условий выполнения, если все предыдущие условия имели значение False. Наконец, можно задать дополнительный блок кода, который будет выполняться в том случае, если ни одно из условий не имеет значения True.
Синтаксис инструкции If в общем случае имеет следующий вид:
if (условие1) {блок_кода1} [elseif (условие2) {блок_кода2}] [else {блок_кода3}]
При выполнении инструкции If проверяется истинность условного выражения условие1.
Замечание
Условные выражения в PowerShell формируются, чаще всего, с помощью операторов сравнения и логических операторов, рассмотренных в лекции 17. Кроме того, важной особенностью языка является то, что в качестве условных выражений можно использовать конвейеры команд PowerShell.
Если условие1 имеет значение true, то выполняется блок_кода1, после чего PowerShell завершает выполнение инструкции If. Если условие1 имеет значение false, то PowerShell проверяет истинность условного выражения условие2. Если условие2 имеет значение true, то выполняется блок_кода2, после чего PowerShell завершает выполнение инструкции If. Если и условие1, и условие2 имеют значение false, то выполняется блок_кода3, а затем PowerShell завершает выполнение инструкции If.
Приведем пример использования инструкции If в интерактивном режиме работы. Запишем сначала в переменную $a число 10:
PS C:\> $a=10
Сравним теперь значение переменной $a с числом 15 (в нашем примере используется командлет Write-Host, который выводит информацию на экран):
PS C:\> if ($a -eq 15) { >> Write-Host '"Значение $a равно 15' >> } >> else {Write-Host 'Значение $a не равно 15'} >> Значение $a не равно 15
Из данного примера также видно, что в оболочке PowerShell в интерактивном режиме можно выполнять инструкции, состоящие из нескольких строк (это может оказаться очень кстати при отладке сценариев).
Цикл While
В PowerShell поддерживаются несколько видов циклов. Самый простой из них – цикл While, в котором команды выполняются в до тех пор, пока проверяемое условие имеет значение True.
Инструкция While имеет следующий синтаксис:
while (условие){блок_команд}
При выполнении инструкции While оболочка PowerShell вычисляет раздел условие инструкции, прежде чем перейти к разделу блок_команд. Условие в инструкции принимает значения True или False. До тех пор, пока условие имеет значение True, PowerShell повторяет выполнение раздела блок_команд.
Замечание
Как и в инструкции If, в условном выражении цикла While может использоваться конвейер команд PowerShell.
Раздел блок_команд инструкции While содержит одну или несколько команд, которые выполняются каждый раз при входе и повторении цикла.
Например, следующая инструкция While отображает числа от 1 до 3, если переменная $val не была создана, или была создана и инициализирована значением 0.
while($val -ne 3) { $val++ Write-Host $val }
В данном примере условие (значение переменной $val не равно 3) имеет значение true, пока $val равно 0, 1 или 2. При каждом повторении цикла значение $val увеличивается на 1 с использованием унарного оператора увеличения значения ++ ( $val++ ). При последнем выполнении цикла значением $val становится 3. При этом проверяемое условие принимает значение false, и цикл завершается.
При интерактивной работе команды удобнее записывать в одной строке, например:
PS C:\> while($val -ne 3){$val++; Write-Host $val} 1 2 3while($val -ne 3){$val++; Write-Host $val}
Обратите внимание, что в качестве разделителя команд в PowerShell используется точка с запятой ( ; ).
Цикл Do … While
Цикл Do…While похож на цикл While, однако условие в нем проверяется не до блока команд, а после:
do{блок_команд}while (условие)
Например:
PS C:\> $val=0 PS C:\> do {$val++; Write-Host $val} while($val -ne 3) 1 2 3
Цикл For
Инструкция For в PowerShell реализует еще один тип циклов – цикл со счетчиком. Обычно цикл For применяется для итерации массива значений и выполнение действий на подмножестве этих значений. В PowerShell инструкция For используется не так часто, как в других языках программирования, так как коллекции объектов обычно удобнее обрабатывать с помощью инструкции Foreach. Однако, если необходимо знать, с каким именно элементом коллекции или массива мы работаем на данной итерации, то цикл For может помочь.
Синтаксис инструкции For:
for (инициация; условие; повторение){блок_команд}
Составные части цикла For имеют следующий смысл:
- инициация — это одна или несколько разделяемых запятыми команд, выполняемых перед началом цикла. Данная часть цикла обычно используется для создания и присвоения начального значения переменной, которая будет затем основой для проверяемого условия в следующей части инструкции For.
- условие — часть инструкции For, которая может принимать логическое значение true или false. PowerShell проводит оценку условия при каждом выполнении цикла For. Если результатом этой оценки является true, то выполняются команды в блоке блок_команд, после чего проводится новая оценка условия инструкции. Если результатом оценки условия вновь становится true, команды блока блок_команд выполняются вновь, и т.д., пока результатом проверки условия не станет false.
- повторение — это одна или несколько разделяемых запятыми команд, выполняемых при каждом повторении цикла. Данная часть цикла обычно используется для изменения переменной, проверяемой внутри условия.
- блок_команд — это набор из одной или нескольких команд, выполняющихся при вхождении в цикл или при повторении цикла. Содержимое блока блок_команд заключается в фигурные скобки.
Классический пример:
PS C:\> for ($i=0; $i -lt 5; $i++) { Write-Host $i } 0 1 2 3 4