Командная строка и сценарии Windows

Сценарии 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

    Цикл 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

    Запуск сценариев PowerShell

    Давайте запустим наш первый сценарий PowerShell. Для этого создадим с помощью Блокнота Windows текстовый файл test.ps1 и запишем в него одну строку:

    Write-Host "Эта строка печатается из сценария PowerShell"

    Сохраним этот файл в каталоге C:\Script. Как мы помним, сценарии WSH на языках VBScript или JScript можно было запускать из Проводника Windows, щелкая мышью на значках этих сценариев. Со сценариями PowerShell этот метод не работает – если дважды щелкнуть мышью на значке сценария PowerShell, то он не запустится, а откроется для редактирования в Блокноте (это позволяет предотвратить случайный запуск сценария).

    Попробуем запустить созданный нами сценарий из оболочки PowerShell:

    PS C:\> C:\script\test.ps1

    Не удается загрузить файл C:\script\test.ps1, так как выполнение сценариев запрещено для данной системы. Введите "get-help about_signing" для получения дополнительных сведений.

    В строка:1 знак:18
    + C:\script\test.ps1 <<<<

    Как мы видим, по умолчанию выполнение сценариев PowerShell вообще запрещено. Это сделано из соображений безопасности, так как в сценариях может содержаться вредоносный код, который может повредить систему или несанкционированно воспользоваться пользовательскими данными.

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

    Политики выполнения сценариев

    Политика выполнения (execution policy) оболочки PowerShell определяет, можно ли на данном компьютере выполнять сценарии PowerShell, и если да, должны ли они быть подписаны цифровой подписью. Кроме того, политика выполнения определяет, можно ли загружать конфигурационные файлы при запуске оболочки. Политика выполнения PowerShell хранится в реестре операционной системы и не удаляется даже при переустановке оболочки PowerShell.

    Возможные политики выполнения PowerShell описаны в табл. 19.1 (получить аналогичную информацию в PowerShell можно с помощью команды Get-Help about_signing ).

    Политики выполнения PowerShell
    Название политикиОписание
    Restricted Данная политика выполнения используется по умолчанию, она запрещает выполнение сценариев и загрузку конфигурационных файлов (можно пользоваться только одиночными командами PowerShell в интерактивном режиме)
    AllSigned Выполнение сценариев PowerShell разрешено, однако все сценарии (как загруженные из Интернета, так и локальные) должны иметь цифровую подпись надежного издателя. Перед выполнением сценариев надежных издателей запрашивается подтверждение
    RemoteSigned Выполнение сценариев PowerShell разрешено, при этом все сценарии и файлы конфигураций, загруженные из Интернета (в том числе по электронной почте и с помощью программ мгновенного обмена сообщениями), должны иметь цифровую подпись надежного издателя, а локальные сценарии могут быть неподписанными. При запуске сценариев надежных издателей подтверждение не запрашивается
    Unrestricted Разрешается выполнение любых сценариев PowerShell без проверки цифровой подписи. При запуске сценариев и файлов конфигураций, загруженных из Интернета, выдается предупреждение

    Узнать, какая политика выполнения является активной, можно с помощью командлета Get-ExecutionPolicy:

    PS C:\> Get-ExecutionPolicy
    Restricted

    Командлет Set-ExecutionPolicy позволяет сменить политику выполнения. Например, для установки политики выполнения RemoteSigned нужно выполнить следующую команду:

    Set-ExecutionPolicy RemoteSigned

    Проверим снова текущую политику:

    PS C:\> Get-ExecutionPolicy
    RemoteSigned

    Теперь вновь попробуем запустить наш сценарий:

    PS C:\> C:\script\test.ps1

    Эта строка печатается из сценария PowerShell

    Как мы видим, сценарий test1.ps1 успешно выполнен.

    При запуске сценариев PowerShell следует учесть, что путь к файлу с кодом нужно всегда указывать явно, даже если сценарий находится в текущем каталоге. В противном случае сценарий не будет выполнен, например:

    PS C:\> cd script
    PS C:\script> dir
    
        Каталог: Microsoft.PowerShell.Core\FileSystem::C:\script
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        09.12.2007     17:37         59 test.ps1
    
    PS C:\script> test.ps1

    Условие "test.ps1" не распознано как командлет, функция, выполняемая программа или файл сценария. Проверьте условие и повторите попытку.

    В строка:1 знак:9
    + test.ps1 <<<<

    Напомним, что для текущего каталога в системе зарезервировано имя . (точка). Сценарий в текущем каталоге запускается следующим образом:

    PS C:\script> .\test.ps1

    Эта строка печатается из сценария PowerShell

    Для запуска сценария PowerShell непосредственно из командной строки интерпретатора Cmd.exe или с помощью пункта Выполнить (Run) меню Пуск (Start) нужно указать полный путь к этому сценарию после в качестве параметра программы powershell.exe, например:

    C:\> powershell.exe C:\script\test.ps1
    Страницы:

    Сценарии 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

    Цикл 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

    Запуск сценариев PowerShell

    Давайте запустим наш первый сценарий PowerShell. Для этого создадим с помощью Блокнота Windows текстовый файл test.ps1 и запишем в него одну строку:

    Write-Host "Эта строка печатается из сценария PowerShell"

    Сохраним этот файл в каталоге C:\Script. Как мы помним, сценарии WSH на языках VBScript или JScript можно было запускать из Проводника Windows, щелкая мышью на значках этих сценариев. Со сценариями PowerShell этот метод не работает – если дважды щелкнуть мышью на значке сценария PowerShell, то он не запустится, а откроется для редактирования в Блокноте (это позволяет предотвратить случайный запуск сценария).

    Попробуем запустить созданный нами сценарий из оболочки PowerShell:

    PS C:\> C:\script\test.ps1

    Не удается загрузить файл C:\script\test.ps1, так как выполнение сценариев запрещено для данной системы. Введите "get-help about_signing" для получения дополнительных сведений.

    В строка:1 знак:18
    + C:\script\test.ps1 <<<<

    Как мы видим, по умолчанию выполнение сценариев PowerShell вообще запрещено. Это сделано из соображений безопасности, так как в сценариях может содержаться вредоносный код, который может повредить систему или несанкционированно воспользоваться пользовательскими данными.

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

    Политики выполнения сценариев

    Политика выполнения (execution policy) оболочки PowerShell определяет, можно ли на данном компьютере выполнять сценарии PowerShell, и если да, должны ли они быть подписаны цифровой подписью. Кроме того, политика выполнения определяет, можно ли загружать конфигурационные файлы при запуске оболочки. Политика выполнения PowerShell хранится в реестре операционной системы и не удаляется даже при переустановке оболочки PowerShell.

    Возможные политики выполнения PowerShell описаны в табл. 19.1 (получить аналогичную информацию в PowerShell можно с помощью команды Get-Help about_signing ).

    Политики выполнения PowerShell
    Название политикиОписание
    Restricted Данная политика выполнения используется по умолчанию, она запрещает выполнение сценариев и загрузку конфигурационных файлов (можно пользоваться только одиночными командами PowerShell в интерактивном режиме)
    AllSigned Выполнение сценариев PowerShell разрешено, однако все сценарии (как загруженные из Интернета, так и локальные) должны иметь цифровую подпись надежного издателя. Перед выполнением сценариев надежных издателей запрашивается подтверждение
    RemoteSigned Выполнение сценариев PowerShell разрешено, при этом все сценарии и файлы конфигураций, загруженные из Интернета (в том числе по электронной почте и с помощью программ мгновенного обмена сообщениями), должны иметь цифровую подпись надежного издателя, а локальные сценарии могут быть неподписанными. При запуске сценариев надежных издателей подтверждение не запрашивается
    Unrestricted Разрешается выполнение любых сценариев PowerShell без проверки цифровой подписи. При запуске сценариев и файлов конфигураций, загруженных из Интернета, выдается предупреждение

    Узнать, какая политика выполнения является активной, можно с помощью командлета Get-ExecutionPolicy:

    PS C:\> Get-ExecutionPolicy
    Restricted

    Командлет Set-ExecutionPolicy позволяет сменить политику выполнения. Например, для установки политики выполнения RemoteSigned нужно выполнить следующую команду:

    Set-ExecutionPolicy RemoteSigned

    Проверим снова текущую политику:

    PS C:\> Get-ExecutionPolicy
    RemoteSigned

    Теперь вновь попробуем запустить наш сценарий:

    PS C:\> C:\script\test.ps1

    Эта строка печатается из сценария PowerShell

    Как мы видим, сценарий test1.ps1 успешно выполнен.

    При запуске сценариев PowerShell следует учесть, что путь к файлу с кодом нужно всегда указывать явно, даже если сценарий находится в текущем каталоге. В противном случае сценарий не будет выполнен, например:

    PS C:\> cd script
    PS C:\script> dir
    
        Каталог: Microsoft.PowerShell.Core\FileSystem::C:\script
    
    Mode                LastWriteTime     Length Name
    ----                -------------     ------ ----
    -a---        09.12.2007     17:37         59 test.ps1
    
    PS C:\script> test.ps1

    Условие "test.ps1" не распознано как командлет, функция, выполняемая программа или файл сценария. Проверьте условие и повторите попытку.

    В строка:1 знак:9
    + test.ps1 <<<<

    Напомним, что для текущего каталога в системе зарезервировано имя . (точка). Сценарий в текущем каталоге запускается следующим образом:

    PS C:\script> .\test.ps1

    Эта строка печатается из сценария PowerShell

    Для запуска сценария PowerShell непосредственно из командной строки интерпретатора Cmd.exe или с помощью пункта Выполнить (Run) меню Пуск (Start) нужно указать полный путь к этому сценарию после в качестве параметра программы powershell.exe, например:

    C:\> powershell.exe C:\script\test.ps1
    Вернуться к учебному плану