Windows PowerShell проектировалась как интерактивная оболочка командной строки, но в то же время это язык программирования. По мере углубления знаний и понимания PowerShell, вы непременно освоите ряд основных концепций программирования. Одна из них — операторы, и возможно, вы уже использовали их, не обязательно обладая всей полнотой знания.
Термин «оператор» относится к одному или нескольким символам в команде или выражении, по-особому интерпретируемым PowerShell. Так, оператор сложения представляет собой символ «+", и PowerShell воспринимает его как означающий сложение. Операторы зависят от контекста. Например, символ»+«не воспринимается как оператор сложения внутри строки в кавычках. Кроме того, не все операторы представлены одним символом (как»+«); некоторые состоят из нескольких символов (в частности, -eq, -or и -not).
Операторы PowerShell попадают в несколько различных категорий. В частности, арифметические операторы выполняют операции в основном с числами, но также воздействуют на строки и данные других типов. Наряду с основными назначениями, математическими действиями, операторами сравнения и логики PowerShell располагает рядом операторов, которые позволяют экономить время и усилия при программировании (такие как -like, -match, -replace, -contains, -split и -join). Рассмотрим различные категории операторов и способы их использования в PowerShell.
Арифметические операторы
Арифметические операторы состоят из следующих символов: + (сложение), — (вычитание), * (умножение), / (деление) и % (модуль или остаток от деления). Поведение этих операторов в точности соответствует ожидаемому при обработке чисел. Это означает, что PowerShell можно использовать как простой калькулятор, вводя выражения в командной строке PowerShell. На экране 1 показано несколько простых примеров.
Экран 1. Пример арифметических операторов |
PowerShell вычисляет арифметические выражения слева направо и в соответствии с обычным порядком операций (умножение, деление, сложение, затем вычитание), если не применяются скобки для группирования. PowerShell игнорирует пробелы между операторами, поэтому можно использовать пробелы в арифметических выражениях, если это упрощает восприятие.
Помимо работы с числами, операторы + и * работают со строками, как показано на экране 1. В частности, оператор + объединяет строки. Оператор * повторяет строку.
Операторы присваивания
Операторы присваивания определяют значения переменных или свойств объекта. Самый распространенный оператор присваивания -»=«, он устанавливает значение переменной или свойства объекта. Существуют и другие операторы присваивания: +=, -=, *=, /=, %=, ++ и --. Они изменяют значение перед присвоением. Некоторые операторы присваивания показаны на экране 2.
Экран 2. Пример операторов присваивания |
Операторы сравнения
Операторы сравнения осуществляют сравнение значений в PowerShell. Существует четыре вида операторов сравнения: равенства, соответствия, вложения и замены. Рассмотрим каждый из них.
Операторы равенства — это равно (-eq), не равно (-ne), больше чем (-gt), больше или равно (-ge), меньше чем (-lt) и меньше или равно(-le). В PowerShell знак (=) не используется для проверки равенства, так как он применяется в качестве оператора присваивания. Аналогично, в PowerShell не используются символы больше чем (>) и меньше чем (<), которые применяются для перенаправления вывода и ввода, соответственно.
Все операторы равенства возвращают логическое значение ($true или $false), которое указывает на результат сравнения. Например, выражение
$var -eq 5
Возвращает $true, если $var содержит 5, или $false в противном случае.
Операторы соответствия, -like, -notlike, -match и -notmatch. Эти операторы выполняют сопоставление шаблонов. Операторы -like и -notlike используют подстановочные знаки (? и *), тогда как операторы -match и -notmatch регулярные выражения. Эти операторы возвращают логическое значение ($true или $false) в зависимости от того, совпадает (или не совпадает) выражение на левой стороне с выражением на правой стороне оператора. На экране 3 показаны операторы соответствия в действии.
Экран 3. Пример операторов сравнения |
Операторы вложения. Существует два оператора вложения: -contains и -notcontains. Эти операторы возвращают логическое значение ($true или $false) в зависимости от того, существует ли значение с правой стороны оператора в наборе значений с левой стороны оператора. Эти операторы обеспечивают удобный способ проверить, существует ли данное значение в массиве. Например, выражение
»A«,"B»,«C" -contains $str
возвращает $true, если $str содержит символ A, B или C (без учета регистра). Если выражение на левой стороне представляет собой единственное значение (не массив), то операторы -contains и –notcontains действуют так же, как операторы -eq и –ne соответственно.
Оператор замены. Оператор -replace заменяет шаблон во входном значении с использованием регулярного выражения. Этот оператор применяет два аргумента (разделенные запятой): шаблон регулярного выражения и заменяющее значение. Например, выражение
»The rain in Seattle«-replace»rain«,"hail»
возвращает строку «The hail in Seattle». Как отмечалось, оператор -replace также работает с регулярными выражениями, поэтому выражение PowerShell
«kenmyer@contoso.com» -replace '^[\w]+@(.+)', '$1'
возвращает строку «contoso.com». Если вы не знакомы с регулярными выражениями, то изучите пояснения в разделе about_Regular_Expressions справки по PowerShell.
По умолчанию все операторы сравнения PowerShell (а также -split), который будет описан чуть ниже) не учитывают регистр. Чтобы учитывать регистр, предварите оператор символом «c". Например, -ceq — учитывающий регистр вариант -eq, -creplace — учитывающий регистр вариант -replace, а -csplit — учитывающий регистр вариант -split. Технически PowerShell также поддерживает префикс i, с помощью которого можно указать операторы без учета регистра (например, -ieq, -ireplace и -isplit), но данный префикс используется редко, так как эти операторы не учитывают регистр по умолчанию.
Операторы разделения и объединения
Оператор split разделяет строку на массив подстрок. Оператор -join выполняет обратное действие, объединяет массив строк в одну строку. Благодаря операторам -split и -join преобразовать строку в массив (и наоборот) очень просто. В обоих операторах можно указать один или несколько символов разграничения, чтобы задать способ деления или объединения строки. На экране 4 показано несколько примеров использования этих операторов.
Экран 4. Пример операторов разделения и объединения |
Логические операторы
С помощью логических операторов можно соединить выражения или инструкции в одно выражение. Эти операторы: -and, -or, -xor, -not и! (! — то же, что -not). Как и в арифметических операторах, здесь можно использовать скобки в выражениях, чтобы вычислять их в нужном порядке. Эти операторы работают, как в других языках программирования. Например, выражение
($var + 3 -eq 6) -or ($var — 3 -eq 0)
возвращает $true, если $var содержит 3.
PowerShell прекращает вычисление выражений с любой стороны логического оператора после того, как будет получен результат $true. Иногда такой метод называют сокращенным вычислением. Сценарий Test-Truth.ps1 в листинге 1 демонстрирует, как сокращенное вычисление используется в PowerShell.
В функциях AddOne и SubtractOne сценария используется команда Write-Host. По выводу сценария ясно видно, когда PowerShell вызывает (или не вызывает) функции.
Операторы типа
Операторы типа — -is и -isnot. Эти операторы проверяют, имеет ли (или не имеет) значение на левой стороне оператора конкретный тип Microsoft. NET. Например, выражение
3 -is [Int]
возвращает $true, тогда как выражение
»fabrikam«-isnot [String]
возвращает $false.
Операторы перенаправления
Операторы перенаправления перечислены в приведенной таблице. Как мы видим, многие новые операторы перенаправления появились в версии PowerShell 3.0. Сейчас PowerShell обеспечивает лишь перенаправление вывода, но в следующей версии может быть реализовано перенаправление ввода.
Использовать операторы перенаправления просто. Например, если нужно перенаправить вывод команды Get-ChildItem в файл Output.txt, то следует выполнить команду:
Get-ChildItem C:\,nofile > Output.txt 2>&1
Файл Output.txt также будет содержать сообщения об ошибках.
При использовании операторов перенаправления важно помнить, что PowerShell записывает текст в выходном файле в формате Unicode. Чтобы отменить вывод в формате Unicode, используйте команды Out-File вместо операторов > или >>.
Специальные операторы
Специальные операторы PowerShell представляют собой набор операторов, которые не попадают в другие категории. Таких операторов девять.
Оператор вызова (&) запускает команду, сценарий или блок сценария. Данный оператор указывает, что следующее выражение должно быть выполнено.
При интерактивной работе с PowerShell необходимо использовать оператор & для запуска программы, содержащей пробелы в имени или пути. Например, если используется команда
»C:\Program Files (x86)\Test App\MyApp.exe«
PowerShell не запускает программу MyApp.exe. Он просто отображает строку на экране. Если нужно запустить MyApp.exe как программу, необходимо поместить оператор & перед строкой:
&»C:\Program Files (x86)\Test App\MyApp.exe«
Оператор разыменования свойства (.). Оператор разыменования свойства указывает, что выражение слева от символа точки представляет собой объект, а выражение справа — член объекта (свойство или метод). Например, $file.Name ссылается на свойство Name объекта в переменной $file.
Оператор вызова с использованием точки (.). Вы можете использовать символ точки для запуска сценария в текущем диапазоне. Обычно при запуске сценария PowerShell создает новый диапазон для сценария, то есть переменные и функции, созданные сценарием, отбрасываются после завершения сценария. Если вы не хотите, чтобы PowerShell создавал новый диапазон при запуске сценария, необходимо предварить сценарий оператором вызова с использованием точки. Например, если имеется список полезных функций в файле сценария MyFunctions.ps1, то можно задействовать оператор вызова для загрузки сценариев:
. MyFunctions.ps1
Функции, определенные в MyFunctions.ps1, будут доступны после завершения сценария.
Оператор статического члена (::). Чтобы получить доступ к статическому члену класса. NET, можно использовать оператор статического члена. Класс представляет собой тип объекта, а статический член — свойство или метод класса. Например, выражение
[DateTime]::Now
ссылается на статическое свойство класса DateTime. NET.
Оператор диапазона (..). Данный оператор возвращает массив целых чисел, представленных нижними и верхними границами целых чисел на каждой стороне двух последовательных точек. Например, выражение 1..3 выводит массив из трех элементов (1, 2, 3), а выражение 9..6 выводит массив из четырех элементов (9, 8, 7, 6).
Оператор формата (-f). Оператор -f форматирует строку на основе правил форматирования строки. NET. Входная строка (то есть строка с левой стороны оператора –f) должна содержать подстроку с фигурными скобками и индексом выражения, как в {0:N2}. Оператор -f принимает массив с правой стороны, поэтому первое число после открытой фигурной скобки в подстроке указывает, какой элемент массива форматировать (0 для первого элемента, 1 для второго и т.д.). Например, выражение
»{0:N1} and {1:N2}«-f (100/3),(76/3)
возвращает строку»33.3 и 25.33«. То есть первое выражение (индекс 0) после -f (100/3) будет форматировано с кодом форматирования N1 (один десятичный знак после запятой), а второе выражение (индекс 1) после -f (76/3) будет форматировано с кодом форматирования N2 (два десятичных знака после запятой). Информацию о кодах форматирования можно найти на странице Formatting Types сайта MSDN (msdn.microsoft.com/en-us/library/26etazsy.aspx).
Оператор части выражения. Оператор $( ) обеспечивает вычисление выражения между символами $( и ). Этот оператор полезен, если нужно вычислить выражение внутри строки в кавычках, в частности, если нужно получить свойство объекта. Например, пусть имеется переменная $myString, содержащая строку»KenDyer«. Выражение
»$myString is $myString.Length characters long«
выдаст»KenDyer is KenDyer.Length characters long«, результат, вероятно, не соответствующий ожидаемому. Чтобы решить эту задачу, можно использовать оператор $( ), чтобы получить нужный результат. В этом примере выражение
»$myString is $($myString.Length) characters long«
выдаст результат, который, вероятно, ожидался (»KenDyer is 7 characters long«).
Оператор подвыражения массива. Оператор @( ) полезен, когда имеются некоторые данные (такие как свойство объекта или вывод функции или метода), которые могут быть пустыми, единственным значением или массивом. Например, группа Active Directory (AD) может не иметь членов, иметь один член или несколько членов. Оператор подвыражения упорядочивает данные в массив, чтобы упростить обработку. Это демонстрирует сценарий Test-Array.ps1 в листинге 2.
Данный сценарий содержит три функции: Null (не возвращает ничего), SingleItem (возвращает единственный элемент) и MultipleItems (возвращает несколько элементов). Когда сценарий вызывает каждую функцию, используется @( ) для каждого вызова функции, чтобы переменная $testVar содержала массив, независимо от числа элементов, возвращаемых функцией. Например, SingleItem возвращает единственную строку; у строк нет свойства Count, поэтому переменная $numElements будет $null. Использование @( ) помогает добиться единообразия сценария независимо от числа элементов, возвращаемых из любых функций.
Оператор запятая (,). Если поместить данный оператор перед единственным значением, то можно сформировать одноэлементный массив. Например, выражение
$items =, »A«
назначает одноэлементный массив переменной $items. Можно также поместить оператор «запятая» между элементами в списке, чтобы создать многоэлементный массив. Например, выражение
$items =»A«,"B»,«C"
назначает трехэлементный массив переменной $items.
Изучайте операторы
Как мы видим, PowerShell располагает длинным списком операторов. В разделах справки PowerShell, начиная с about_Operators, приводится подробное описание различных категорий операторов с примерами. Если вы хотите повысить эффективность своего программного кода, глубокое понимание операторов PowerShell необходимо.
function AddOne($number) { $number++ write-host»AddOne: $number« $number # Output result } function SubtractOne($number) { $number-- write-host»SubtractOne: $number« $number # Output result } $number = 1 write-host»Short-circuit evaluation:« # Пример сокращенного вычисления: выражение # на левой стороне оператора -or имеет значение $true, поэтому # PowerShell не нужно вычислять выражение # на правой стороне оператора -or. (AddOne $number) -eq 2 -or (SubtractOne $number) -eq 0 # Выводит»AddOne: 2«и "True», но не выводит # «SubtractOne: 0». write-host # PowerShell должен вычислить выражения на обоих сторонах # оператора –and, чтобы определить значение всего # выражения — $true или $false. (AddOne $number) -eq 2 -and (SubtractOne $number) -eq 0 # Outputs «AddOne: 2», «SubtractOne: 0», and «True».
Листинг 2. Сценарий Test-Array.ps1
# Не возвращает ничего function Null { } # Возвращает единственный элемент function SingleItem { «A" } # Возвращает несколько элементов function MultipleItems { »A«,"B»,«C" } $testVar = @(Null) $numElements = $testVar.Count »Number of elements: $numElements« # Выводит»Number of elements: 0« $testVar = @(SingleItem) $numElements = $testVar.Count »Number of elements: $numElements« # Выводит»Number of elements: 1« $testVar = @(MultipleItems) $numElements = $testVar.Count »Number of elements: $numElements« # Выводит»Number of elements: 3"