about_Operators

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

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

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

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

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

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

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

Побитовые операторы (-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 Framework объекта.

Дополнительные сведения см. в разделе 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

Оператор subexpression массива @( )

Возвращает результат одного или нескольких операторов в виде массива. Результатом всегда является массив из 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.

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

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 отображает содержимое строки в кавычках вместо запуска скрипта. Оператор вызова позволяет выполнить содержимое строки, содержащей имя файла.

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

Оператор & background также является признаком конца инструкции, как и оператор элемента управления 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)

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

Оператор dot sourcing .

Запускает скрипт в текущем область, чтобы все функции, псевдонимы и переменные, создаваемые скриптом, добавлялись в текущий область, переопределяя существующие. Параметры, объявленные скриптом, становятся переменными. Параметры, для которых не было задано значение, становятся переменными без значения. Однако автоматическая переменная $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 можно использовать для представления массива последовательных целых чисел или символов. Значения, соединенные оператором диапазона, определяют начальную и конечную значения диапазона.

Примечание

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

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

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

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

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

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

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

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 нельзя использовать для надежного представления членов перечисления.

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

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

$myProcess.peakWorkingSet
(Get-Process PowerShell).kill()
'OS', 'Platform' | Foreach-Object { $PSVersionTable. $_ }

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

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

Вызывает статические свойства и методы класса платформа .NET Framework. Чтобы найти статические свойства и методы объекта, используйте параметр 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]

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