about_Operators

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Операторы сравнения ограничений определяют, отображается ли тестовое значение в наборе ссылок (-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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 логическим контекстом. Если назначено $textFilesодно или несколько объектов FileInfo, условный результат оценивается$true. Вы можете работать со значением $textFiles в тексте if инструкции.

Примечание.

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

Оператор вложенных выражений $( )

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

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.

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

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 (&), который выполняет команду перед асинхронно в подshell в качестве задания.

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

Get-Process -Name pwsh &

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

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

Как и в случае Start-Jobс фоновым оператором &Job , возвращается объект. Этот объект можно использовать и Receive-JobRemove-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.

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

Преобразует или ограничивает объекты указанным типом. Если объекты не могут быть преобразованы, 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

Примечание.

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

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

. .\sample.ps1

Оператор форматирования -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 и составном форматировании.

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

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

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

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

Примечание.

Добавлена поддержка диапазонов символов в 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

Внимание

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

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

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

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. Чтобы найти статические свойства и методы объекта, используйте статический параметр командлета Get-Member . Имя члена может быть выражением.

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

Оператор Ternary ? <if-true> : <if-false>

Оператор ternary можно использовать в качестве замены инструкции 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>} не следует путать с оператором вложенных выражений $() . Дополнительные сведения см. в разделе "Имя переменной" 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]

См. также