Поделиться через


about_Operators

Краткое описание

Описывает операторы, поддерживаемые PowerShell.

Длинное описание

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

Арифметические операторы

Используйте арифметические операторы (, , , , ) для вычисления значений в команде или выражении. С помощью этих операторов можно добавлять, вычитать, умножать или разделять значения, а также вычислять оставшуюся часть (модулу) операции деления.

Оператор добавления объединяет элементы. Оператор умножения возвращает указанное количество копий каждого элемента. Арифметические операторы можно использовать для любого типа .NET, реализующего их, например: Int, String, DateTime, Hashtable и массивов.

Побитовые операторы (, , , , , ) управляют битовых шаблонов в значениях.

Дополнительные сведения см. в about_Arithmetic_Operators.

операторы присваивания

Используйте операторы назначения (, , , , , ) для назначения, изменения или добавления значений в переменные. Можно объединить арифметические операторы с назначением, чтобы назначить результат арифметической операции переменной.

Дополнительные сведения см. в about_Assignment_Operators.

Операторы сравнения

Используйте операторы сравнения (, , , , , ) для сравнения значений и условий тестирования. Например, можно сравнить два строковых значения, чтобы определить, равны ли они.

Операторы сравнения также включают операторы, которые находят или заменяют шаблоны в тексте. Операторы (, , ) используют регулярные выражения и (,) используют подстановочные знаки, например и .

Операторы сравнения ограничений определяют, отображается ли значение теста в наборе ссылок (, , , ).

Операторы сравнения типов (, ) определяют, является ли объект заданным типом.

Дополнительные сведения см. в about_Comparison_Operators.

Логические операторы

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

Дополнительные сведения см. в about_Logical_Operators.

Операторы перенаправления

Используйте операторы перенаправления (, , , и ) для отправки выходных данных команды или выражения в текстовый файл. Операторы перенаправления работают как командлет (без параметров), но также позволяют перенаправить выходные данные ошибок в указанные файлы. Вы также можете использовать командлет для перенаправления выходных данных.

Дополнительные сведения см. в about_Redirection

Операторы разделения и соединения

Операторы и разделяют и объединяют подстроки. Оператор разбивает строку на подстроки. Оператор объединяет несколько строк в одну строку.

Дополнительные сведения см. в about_Split и about_Join.

Операторы типов

Используйте операторы типов (-is, -isnot, -as) для поиска или изменения типа .NET объекта.

Дополнительные сведения см. в about_Type_Operators.

Унарные операторы

Используйте унарные и операторы для увеличения или уменьшения значений и для отрицания. Например, чтобы увеличить переменную от до , введите .

Дополнительные сведения см. в about_Arithmetic_Operators.

Специальные операторы

Специальные операторы имеют конкретные варианты использования, которые не соответствуют какой-либо другой группе операторов. Например, специальные операторы позволяют выполнять команды, изменять тип данных значения или извлекать элементы из массива.

Оператор группировки

Как и в других языках, служит для переопределения приоритета оператора в выражениях. Например,

Однако в PowerShell существуют дополнительные действия.

Группирование выражений результатов

позволяет разрешить выходные данные команды участвовать в выражении. Рассмотрим пример.

PS> (Get-Item *.txt).Count -gt 10
True

Сгруппированные выражения piping

При использовании в качестве первого сегмента конвейера оболочка команды или выражения в скобках неизменно вызывает перечисление результата выражения. Если скобки упаковывают команду, выполняется до завершения всех выходных данных, собранных в памяти до отправки результатов через конвейер.

Группирование выражения перед пипсингом также гарантирует, что последующая обработка объектов по объекту не может препятствовать перечислению, которую команда использует для создания выходных данных.

Инструкции группирования назначений

Операторы негруппированных назначений не выводить значения. При группировке инструкции назначения значение назначенной переменной передается и может использоваться в более крупных выражениях. Рассмотрим пример.

PS> ($var = 1 + 2)
3
PS> ($var = 1 + 2) -eq 3
True

Упаковка инструкции в круглые скобки превращает ее в выражение, которое выводит значение .

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

PS> $i = 0
PS> (++$i) # prefix
1
PS> $i = 0
PS> ($i++) # postfix
0
PS> $i
1

В случае префикса значение увеличивается перед выходом. В случае постфикса значение увеличивается после вывода.

Этот метод также можно использовать в контексте условного оператора, например инструкции .

if ($textFiles = Get-ChildItem *.txt) {
    $textFiles.Count
}

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

Note

Хотя этот метод является удобным и кратким, он может привести к путанице между оператором назначения () и оператором сравнения равенства ().

Оператор subexpression

Возвращает результат одной или нескольких инструкций. Для одного результата возвращает скаляр. Для нескольких результатов возвращает массив. Используйте это, если вы хотите использовать выражение в другом выражении. Например, чтобы внедрить результаты команды в строковое выражение.

PS> "Today is $(Get-Date)"
Today is 12/02/2019 13:15:20

PS> "Folder list: $((dir C:\ -Dir).Name -join ', ')"
Folder list: Program Files, Program Files (x86), Users, Windows

Оператор вложенных выражений массива

Возвращает результат одной или нескольких инструкций в виде массива. Результат всегда представляет собой массив из 0 или более объектов.

PS> $list = @(Get-Process | Select-Object -First 10; Get-Service | Select-Object -First 10 )
PS> $list.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS> $list.Count
20
PS> $list = @(Get-Service | Where-Object Status -EQ Starting )
PS> $list.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS> $list.Count
0

Синтаксис литерала хэш-таблицы

Как и вложенное выражение массива, этот синтаксис используется для объявления хэш-таблицы. Дополнительные сведения см. в about_Hash_Tables.

Оператор вызова

Выполняет команду, скрипт или скрипт. Оператор вызова, также известный как оператор вызова, позволяет выполнять команды, хранящиеся в переменных и представленные строками или скриптами. Оператор вызова выполняется в дочерней области. Дополнительные сведения о областях см. в about_Scopes. Это можно использовать для создания строк, содержащих необходимые команды, параметры и аргументы, а затем вызвать строку, как если бы она была командой. Создаваемые строки должны соответствовать тем же правилам синтаксического анализа, что и команда, введенная в командной строке. Дополнительные сведения см. в about_Parsing.

В этом примере команда хранится в строке и выполняется с помощью оператора вызова.

PS> $c = "Get-ExecutionPolicy"
PS> $c
Get-ExecutionPolicy
PS> & $c
AllSigned

Оператор вызова не анализирует строки. Это означает, что при использовании оператора вызова нельзя использовать параметры команды в строке.

PS> $c = "Get-Service -Name Spooler"
PS> $c
Get-Service -Name Spooler
PS> & $c
& : The term 'Get-Service -Name Spooler' is not recognized as the name of a
cmdlet, function, script file, or operable program. Check the spelling of
the name, or if a path was included, verify that the path is correct and
try again.

Командлет Invoke-Expression может выполнять код, который приводит к ошибкам синтаксического анализа при использовании оператора вызова.

PS> & "1+1"
&: The term '1+1' is not recognized as a name of a cmdlet, function, script
file, or executable program. Check the spelling of the name, or if a path was
included, verify that the path is correct and try again.

PS> Invoke-Expression "1+1"
2

Скрипт можно выполнить с помощью имени файла. Файл скрипта должен иметь расширение файла для исполняемого файла. Файлы с пробелами в пути должны быть заключены в кавычки. При попытке выполнить кавычек путь PowerShell отображает содержимое кавычек вместо запуска скрипта. Оператор вызова позволяет выполнять содержимое строки, содержащей имя файла.

PS C:\Scripts> Get-ChildItem

    Directory: C:\Scripts


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        8/28/2018   1:36 PM             58 script name with spaces.ps1

PS C:\Scripts> ".\script name with spaces.ps1"
.\script name with spaces.ps1
PS C:\Scripts> & ".\script name with spaces.ps1"
Hello World!

Дополнительные сведения о скриптах см. в about_Script_Blocks.

Фоновый оператор

Запускает конвейер перед ним в фоновом режиме в задании PowerShell. Этот оператор действует аналогично амперсандам оператора управления Unix (), который выполняет команду перед асинхронно в подshell в качестве задания.

Этот оператор функционально эквивалентен . По умолчанию фоновый оператор запускает задания в текущем рабочем каталоге вызывающего объекта, запускающего параллельные задачи. В следующем примере показано базовое использование оператора фонового задания.

Get-Process -Name pwsh &

Эта команда функционально эквивалентна следующему использованию :

Start-Job -ScriptBlock {Get-Process -Name pwsh}

Как и , оператор фона возвращает объект . Этот объект можно использовать с и , как если бы вы использовали для запуска задания.

$job = Get-Process -Name pwsh &
Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

Remove-Job $job

Оператор фона также является конечным оператором оператора, так же как и амперсанда оператора управления Unix (). Это позволяет вызывать дополнительные команды после фонового оператора. В следующем примере показано вызов дополнительных команд после фонового оператора.

$job = Get-Process -Name pwsh & Receive-Job $job -Wait

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00     221.16      25.90    6988 988 pwsh
      0     0.00     140.12      29.87   14845 845 pwsh
      0     0.00      85.51       0.91   19639 988 pwsh

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

$job = Start-Job -ScriptBlock {Get-Process -Name pwsh}
Receive-Job $job -Wait

Если вы хотите выполнить несколько команд, каждый из них в собственном фоновом процессе, но все в одной строке, просто поместите между каждой из команд.

Get-Process -Name pwsh & Get-Service -Name BITS & Get-CimInstance -ClassName Win32_ComputerSystem &

Дополнительные сведения о заданиях PowerShell см. в about_Jobs.

Оператор приведения

Преобразует или ограничивает объекты указанным типом. Если объекты не могут быть преобразованы, PowerShell создает ошибку.

[datetime] '2/20/88' - [datetime] '1/20/88' -eq [timespan] '31'

Приведение также можно выполнить, когда переменная назначается с использованием нотации приведения.

Оператор запятой

В качестве двоичного оператора запятая создает массив или добавляется к создаваемому массиву. В режиме выражения в качестве унарного оператора запятая создает массив только с одним элементом. Поместите запятую перед элементом.

$myArray = 1,2,3
$SingleArray = ,1
Write-Output (,1)

Так как ожидает аргумент, необходимо поместить выражение в скобки.

Оператор dot sourcing

Запускает скрипт в текущей области, чтобы все функции, псевдонимы и переменные, создаваемые скриптом, добавлялись в текущую область, переопределяя существующие. Параметры, объявленные скриптом, становятся переменными. Параметры, для которых значение не было задано, становятся переменными без значения. Однако сохраняется автоматическая переменная .

. C:\scripts\sample.ps1 1 2 -Also:3

Note

За оператором dot sourcing следует пробел. Используйте пробел, чтобы отличить точку от символа точки (), представляющего текущий каталог.

В следующем примере скрипт Sample.ps1 в текущем каталоге выполняется в текущей области.

. .\sample.ps1

Оператор форматирования

Предоставьте доступ к функции .NET составного форматирования. Строка составного формата состоит из фиксированного текста, пересекаемого с индексированных заполнителей, называемых элементами форматирования. Эти элементы формата соответствуют объектам в списке.

Каждый элемент формата принимает следующую форму и состоит из следующих компонентов:

{index[,alignment][:formatString]}

Необходимы соответствующие фигурные скобки ( и ).

Операция форматирования дает результирующий текст, состоящий из исходного фиксированного текста, пересекаемого со строковым представлением объектов в списке. Дополнительные сведения см. в разделе "Составное форматирование".

Введите строку составного формата в левой части оператора и объекты, отформатированные в правой части оператора.

"{0} {1,-10} {2:N}" -f 1,"hello",[Math]::PI
1 hello      3.14

Числовое значение можно использовать с помощью пользовательского описателя "0". Число ноль после указывает максимальную ширину для отформатированного строки.

"{0:00} {1:000} {2:000000}" -f 7, 24, 365
07 024 000365

Если вам нужно сохранить фигурные скобки () в форматируемой строке, вы можете сбежать из них, удвоив фигурные скобки.

"{0} vs. {{0}}" -f 'foo'
foo vs. {0}

Оператор индекса

Выбирает объекты из индексированных коллекций, таких как массивы и хэш-таблицы. Индексы массива основаны на нулях, поэтому первый объект индексируется как . Для получения последних значений можно также использовать отрицательные индексы. Хэш-таблицы индексируются по значению ключа.

При наличии списка индексов оператор индекса возвращает список элементов, соответствующих этим индексам.

PS> $a = 1, 2, 3
PS> $a[0]
1
PS> $a[-1]
3
PS> $a[2, 1, 0]
3
2
1
(Get-HotFix | Sort-Object InstalledOn)[-1]
$h = @{key="value"; name="PowerShell"; version="2.0"}
$h["name"]
PowerShell
$x = [xml]"<doc><intro>Once upon a time...</intro></doc>"
$x["doc"]
intro
-----
Once upon a time...

Если объект не является индексированной коллекцией, с помощью оператора индекса для доступа к первому элементу возвращается сам объект. Значения индекса за пределами первого элемента возвращают .

PS> (2)[0]
2
PS> (2)[-1]
2
PS> (2)[1] -eq $null
True
PS> (2)[0,0] -eq $null
True

Оператор конвейера

Отправляет ("каналы") выходные данные команды, которая предшествует команде, следующей за ней. Если выходные данные включают несколько объектов (коллекция), оператор конвейера отправляет объекты по одному за раз.

Get-Process | Get-Member
Get-Service | Where-Object {$_.StartType -eq 'Automatic'}

Операторы цепочки конвейеров и

Условное выполнение правого конвейера на основе успеха левого конвейера.

# If Get-Process successfully finds a process called notepad,
# Stop-Process -Name notepad is called
Get-Process notepad && Stop-Process -Name notepad
# If npm install fails, the node_modules directory is removed
npm install || Remove-Item -Recurse ./node_modules

Дополнительные сведения см. в About_Pipeline_Chain_Operators.

Оператор range

Оператор диапазона можно использовать для представления массива последовательных целых чисел или символов. Значения, присоединенные оператором диапазона, определяют начальные и конечные значения диапазона.

Note

Добавлена поддержка диапазонов символов в PowerShell 6.

Диапазоны чисел

1..10
$max = 10
foreach ($a in 1..$max) {Write-Host $a}

Кроме того, можно создавать диапазоны в обратном порядке.

10..1
5..-5 | ForEach-Object {Write-Output $_}

Начальные и конечные значения диапазона могут быть любой парой выражений, которые оценивают целое число или символ. Конечные точки диапазона должны быть преобразованы в подписанные 32-разрядные целые числа (). Большие значения вызывают ошибку. Кроме того, если диапазон захватывается в массиве, размер результирующего массива ограничен . Это максимальный размер массива в .NET.

Например, можно использовать элементы перечисления для начальных и конечных значений.

PS> enum Food {
      Apple
      Banana = 3
      Kiwi = 10
    }
PS> [Food]::Apple..[Food]::Kiwi
0
1
2
3
4
5
6
7
8
9
10

Important

Результирующий диапазон не ограничивается значениями перечисления. Вместо этого он представляет диапазон значений между двумя указанными значениями. Оператор диапазона нельзя использовать для надежного представления элементов перечисления.

Диапазоны символов

Чтобы создать диапазон символов, заключите их в кавычки.

PS> 'a'..'f'
a
b
c
d
e
f
PS> 'F'..'A'
F
E
D
C
B
A

Если вы назначаете диапазон символов строке, оно обрабатывается так же, как назначение массива символов строке.

PS> [string]$s = 'a'..'e'
$s
a b c d e
$a = 'a', 'b', 'c', 'd', 'e'
$a
a b c d e

Символы в массиве объединяются в строку. Символы разделяются значением переменной предпочтения . Дополнительные сведения см. в разделе about_Preference_Variables.

Порядок символов в массиве определяется значением ASCII символа. Например, значения ASCII и имеют значение 99 и 88 соответственно. Этот диапазон будет представлен в обратном порядке.

PS> 'c'..'X'
c
b
a
`
_
^
]
\
[
Z
Y
X

Оператор доступа к членам

Обращается к свойствам и методам объекта. Имя члена может быть выражением.

$myProcess.PeakWorkingSet
(Get-Process powershell).Kill()
'OS', 'Platform' | ForEach-Object { $PSVersionTable. $_ }

Начиная с PowerShell 3.0 при использовании оператора в объекте коллекции списков, который не имеет элемента, PowerShell автоматически перечисляет элементы в этой коллекции и использует оператор для каждого из них. Дополнительные сведения см. в разделе about_Member-Access_Enumeration.

При использовании оператора доступа к члену для чтения свойства, которое не существует, или когда метод получения свойства вызывает исключение, PowerShell возвращается вместо того, чтобы вызвать ошибку. Это поведение зависит от доступа к свойствам. Это поведение следует .NET правилу ЦС CA1065, которое указывает:

Свойства — это, по сути, интеллектуальные поля. Поэтому они должны вести себя максимально похоже на поля. Поля не вызывают исключения, и свойства тоже не должны. Если у вас есть свойство, вызывающее исключение, возможно, следует сделать его методом.

Исключения, создаваемые вызовами метода (включая вызов базового метода напрямую), не подавляются.

Оператор статических элементов

Вызывает статические свойства и методы класса .NET. Чтобы найти статические свойства и методы объекта, используйте статический параметр командлета . Имя члена может быть выражением.

[datetime]::Now
'MinValue', 'MaxValue' | ForEach-Object { [int]:: $_ }

Оператор Ternary

Оператор ternary можно использовать в качестве замены инструкции в простых условных случаях.

Дополнительные сведения см. в about_If.

Оператор объединения null

Оператор объединения null возвращает значение левого операнда, если оно не равно NULL. В противном случае он вычисляет правый операнд и возвращает результат. Оператор не оценивает его правый операнд, если левый операнд оценивается как ненулевое.

$x = $null
$x ?? 100
100

В следующем примере правый операнд не будет вычисляться.

[string] $todaysDate = '1/10/2020'
$todaysDate ?? (Get-Date).ToShortDateString()
1/10/2020

Оператор присваивания присваивания null-объединения

Оператор назначения с поддержкой NULL назначает значение правого операнда левой операнды только в том случае, если левый операнд оценивается как null. Оператор не оценивает его правый операнд, если левый операнд оценивается как ненулевое.

$x = $null
$x ??= 100
$x
100

В следующем примере правый операнд не будет вычисляться.

[string] $todaysDate = '1/10/2020'
$todaysDate ??= (Get-Date).ToShortDateString()
$todaysDate
1/10/2020

Операторы с условными значениями NULL и

Note

Эта функция была перенесена из экспериментального в основной в PowerShell 7.1.

Оператор с условным значением NULL применяет доступ к члену, или доступ к элементу, , операции к операнду только в том случае, если этот операнд оценивается как ненулевое; в противном случае возвращает значение NULL.

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

Note

Синтаксис имени переменной не следует путать с оператором вложенных выражений. Дополнительные сведения см. в разделе "Имя переменной" about_Variables.

В следующем примере возвращается значение PropName .

$a = @{ PropName = 100 }
${a}?.PropName
100

В следующем примере возвращается значение NULL, не пытаясь получить доступ к имени участника PropName.

$a = $null
${a}?.PropName

В этом примере возвращается значение индексированного элемента.

$a = 1..10
${a}?[0]
1

В следующем примере возвращается значение NULL, не пытаясь получить доступ к индексированного элемента.

$a = $null
${a}?[0]

См. также

  • about_Arithmetic_Operators
  • about_Assignment_Operators
  • about_Comparison_Operators
  • about_Logical_Operators
  • about_Operator_Precedence
  • about_Member-Access_Enumeration
  • about_Type_Operators
  • about_Split
  • about_Join
  • about_Redirection