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


about_Operators

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

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

Подробное описание

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

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

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

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

Побитовые операторы (-band, -bor, -bxor, -bnot, -shl, -shr) управляют битовые шаблоны в значениях.

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

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

Используйте операторы присваивания (=, +=, -=, *=, /=, ) %=для назначения, изменения или добавления значений к переменным. Арифметические операторы можно объединить с назначением, чтобы назначить результат арифметической операции переменной.

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

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

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

Операторы сравнения также включают операторы, которые находят или заменяют шаблоны в тексте. Операторы (, , ) используют регулярные выражения, а (-like, -notlike) — подстановочные знаки *. -replace-notmatch-match

Операторы сравнения вложения определяют, отображается ли тестовое значение в наборе ссылок (-in, -notin, -contains, -notcontains).

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

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

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

Используйте логические операторы (-and, -or, -xor, -not, !), чтобы соединить условные операторы в один сложный условный оператор. Например, логический -and оператор можно использовать для создания фильтра объектов с двумя разными условиями.

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

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

Используйте операторы перенаправления (>, >>, 2>, 2>>и 2>&1) для отправки выходных данных команды или выражения в текстовый файл. Операторы перенаправления работают аналогично командлету Out-File (без параметров), но также позволяют перенаправлять выходные данные ошибок в указанные файлы. Вы также можете использовать командлет для перенаправления Tee-Object выходных данных.

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

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

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

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

Операторы работы с типами

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

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

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

Используйте унарные ++ операторы и -- для увеличения или уменьшения значений, а - также для отрицания. Например, чтобы увеличить переменную $a с 9 до 10, введите $a++.

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

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

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

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

Как и в других языках, (...) служит для переопределения приоритета операторов в выражениях. Пример: (1 + 2) / 3

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

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

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

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

Конвейер группированных выражений

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

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

Группирование инструкций присваивания

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

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

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

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

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

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

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

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

В этом примере, если файлы не совпадают, Get-ChildItem команда ничего не возвращает и не $textFilesназначает , что считается $false в логическом контексте. Если одному или нескольким объектам FileInfo назначено $textFilesзначение , условный результат оценивается как $true. Можно работать со значением $textFiles в теле if оператора .

Примечание

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

Оператор 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

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

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.

Оператор background &

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

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

Get-Process -Name pwsh &

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

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

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

$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.

Оператор cast [ ]

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

[DateTime] '2/20/88' - [DateTime] '1/20/88' -eq [TimeSpan] '31'

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

Оператор "Запятая" ,

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

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

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

Оператор точечных источников .

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

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

Примечание

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

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

. .\sample.ps1

Оператор Format -f

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

"{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}

Дополнительные сведения см. в разделах Метод String.Format и Составное форматирование.

Оператор Index [ ]

Выбирает объекты из индексированных коллекций, таких как массивы и хэш-таблицы. Индексы массива отсчитываются от нуля, поэтому первый объект индексируется как [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...

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

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 ..

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

Примечание

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

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

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

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

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

Начальные и конечные значения диапазона могут быть любой парой выражений, результатом которого является целое число или символ. Конечные точки диапазона должны быть преобразованы в 32-разрядные целые числа со знаком ([int32]). Большие значения приводят к ошибке. Кроме того, если диапазон фиксируется в массиве, размер результирующего массива ограничивается [int]::MaxValue - 56. Это максимальный размер массива в .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

Важно!

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

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

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

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

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

Порядок символов в массиве определяется значением ASCII символа. Например, значения c ASCII для и X имеют значения 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.

Статический оператор-член ::

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

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

Тернарный оператор ? <if-true> : <if-false>

Тернарный оператор можно использовать в качестве замены оператора if-else в простых условных случаях.

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

Оператор объединения со значением NULL ??

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

$x = $null
$x ?? 100
100

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

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

Оператор присваивания объединения со значением NULL ??=

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

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

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

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

Условные операторы ?. со значением NULL и ?[]

Примечание

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

Условный оператор со значением NULL применяет операцию доступ к операнду, являющемуся элементом (?.) или элементом (?[]), только если значение операнда отлично от NULL. В противном случае он возвращает значение NULL.

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

Примечание

Синтаксис имени переменной ${<name>} не следует путать с оператором $() subexpression. Дополнительные сведения см. в разделе "Имя переменной" 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]

См. также раздел