about_Operators
Краткое описание
Описывает операторы, поддерживаемые PowerShell.
Подробное описание
Оператор — это элемент языка, который можно использовать в команде или выражении. PowerShell поддерживает несколько типов операторов для управления значениями.
Арифметические операторы
Используйте арифметические операторы (+
, -
, *
, /
, %
) для вычисления значений в команде или выражении. С помощью этих операторов можно сложить, вычесть, умножить или разделить значения, а также вычислить остаток (модуль) операции деления.
Оператор сложения объединяет элементы. Оператор умножения возвращает указанное количество копий каждого элемента. Арифметические операторы можно использовать в любом типе .NET, который их реализует, например, Int
, String
, 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 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]