Введение в оболочку командной строки Windows PowerShell. Введение в оболочку командной строки Windows PowerShell
Скачать 368 Kb.
|
Сценарии 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 Сценарии Windows PowerShell Цикл ForeachИнструкция Foreach позволяет последовательно перебирать элементы коллекций. Самым простым и наиболее часто используемым типом коллекции, по которой производится перемещение, является массив. Обычно в цикле Foreach одна или несколько команд выполняются на каждом элементе массива. Особенностью цикла Foreach является то, что его синтаксис и работа зависят от того, где расположена инструкция Foreach: вне конвейера команд или внутри конвейера. Инструкция Foreach вне конвейера командВ этом случае синтаксис цикла Foreach имеет следующий вид: foreach ($элемент in $коллекция){блок_команд} В круглых скобках указывается коллекция, в которой производится итерация. При выполнении цикла Foreach система автоматически создает переменную $элемент. Перед каждой итерацией в цикле этой переменной присваивается значение очередного элемента в коллекции. В разделе блок_команд содержатся команды, выполняемые на каждом элементе коллекции. Например, цикл Foreach в следующем примере отображает значения в массиве с именем $letterArray: PS C:\> $letterArray = "a","b","c","d" PS C:\> foreach ($letter in $letterArray){Write-Host $letter} a b c d В первой команде здесь создается массив $letterArray, в который записываются четыре элемента: символы "a", "b", "c" и "d". При первом выполнении инструкции Foreach переменной $letter присваивается значение, равное первому элементу в $letterArray ( "a" ), затем используется командлет Write-Host для отображения переменной $letter. При следующей итерации цикла переменной $letter присваивается значение "b" и т.д. После того, как будут перебраны все элементы массива $letterArray, произойдет выход из цикла. Инструкция Foreach может также использоваться совместно с командлетами, возвращающими коллекции элементов. Например: PS C:\> $l = 0; foreach ($f in dir *.txt) { $l += $f.length } PS C:\> $l 2690555 Здесь сначала создается и обнуляется переменная $l, затем в цикле Foreach с помощью командлета dir формируется коллекция файлов с расширением txt, находящихся в текущем каталоге. В инструкции Foreach перебираются все элементы этой коллекции, на каждом шаге к текущему элементу (соответствующему файлу) можно обратиться с помощью переменной $f. В блоке команд цикла Foreach к текущему значению переменной $l добавляется значение поля length (размер файла) переменной $f. В результате выполнения данного цикла в переменной $l будет храниться суммарный размер файлов в текущем каталоге, которые имеют расширение txt. Инструкция Foreach внутри конвейера командЕсли инструкция Foreach появляется внутри конвейера команд, то PowerShell использует псевдоним Foreach, соответсвующий командлету Foreach-Object. То есть в этом случае фактически выполняется командлет Foreach-Object и уже не нужно указывать часть инструкции ( $элемент in $коллекция ), так как элементы коллекции блоку команд предоставляет предыдущая команда в конвейере. Синтаксис инструкции Foreach, применяемой внутри конвейера команд, в простейшем случае выглядит следующим образом: команда | foreach {блок_команд} Рассмотренный выше пример с подсчетом суммарного размера текстовых файлов из текущего каталога для данного варианта инструкции Foreach примет следующий вид: PS C:\> $l = 0; dir *.txt | foreach { $l += $_.length } PS C:\> $l 2690555 Замечание Напомним, что специальная переменная $_ используется в командлетах, производящих обработку элементов конвейера, для обращения к текущему объекту конвейера и извлечения его свойств. В общем случае в псевдониме Foreach может указываться не один блок команд, а три: начальный блок команд, средний блок команд и конечный блок команд. Начальный и конечный блоки команд выполняются один раз, а средний блок команд выполняется каждый раз при очередной итерации по коллекции или массиву. Синтаксис псевдонима Foreach, используемого в конвейере команд с начальным, средним и конечным блоками команд выглядит следующим образом: команда | foreach {начальный_блок_команд} {средний_блок_команд}{конечный_блок_команд} Для этого варианта инструкции Foreach наш пример можно записать следующим образом: PS C:\> dir *.txt | foreach {$l = 0}{ $l += $_.length }{Write-Host $l} 2690555 |