Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Редакционная заметка
Важный
Спецификация языка Windows PowerShell версии 3.0 была опубликована в декабре 2012 года и основана на Windows PowerShell 3.0. Эта спецификация не отражает текущее состояние PowerShell. Нет плана обновить эту документацию, чтобы отразить текущее состояние. Эта документация представлена здесь для получения исторической справки.
Документ спецификации доступен в формате Microsoft Word в Центре загрузок Майкрософт: https://www.microsoft.com/download/details.aspx?id=36389. Затем этот документ Word был преобразован для представления на платформе Microsoft Learn. Во время преобразования некоторые редакционные изменения были внесены в соответствии с форматированием платформы Docs. Исправлены некоторые опечатки и незначительные ошибки.
3.1 Поставщики и диски
Поставщик позволяет получить доступ к данным и компонентам, которые в противном случае не будут легко доступны в командной строке. Данные представлены в согласованном формате, который напоминает диск файловой системы.
Данные, предоставляемые поставщиком, отображаются на диске, а доступ к данным осуществляется через путь так же, как и с диском. Встроенные командлеты для каждого поставщика управляют данными на диске поставщика.
PowerShell включает следующий набор встроенных поставщиков для доступа к различным типам хранилищ данных:
| поставщика | имя диска | описание | ссылка |
|---|---|---|---|
| Псевдоним | Псевдоним: | Псевдонимы PowerShell | §3.1.1 |
| Окружающая среда | Env: | Переменные среды | §3.1.2 |
| Файловая система | A:, B:, C:, ... | Диски, каталоги и файлы | §3.1.3 |
| Функция | Функция: | Функции PowerShell | §3.1.4 |
| Переменная | Переменная: | Переменные PowerShell | §3.1.5 |
Windows PowerShell:
| поставщика | имя диска | описание |
|---|---|---|
| Сертификат | Сертификат: | Сертификаты x509 для цифровых подписей |
| Регистратура | HKLM: (HKEY_LOCAL_MACHINE), HKCU: (HKEY_CURRENT_USER) | Реестр Windows |
| WSMan | WSMan: | сведения о конфигурации WS-Management |
Следующие командлеты имеют дело с поставщиками и дисками:
- Get-PSProvider: возвращает сведения об одном или нескольких поставщиках.
- Get-PSDrive: получает сведения об одном или нескольких дисках.
Тип объекта, представляющего поставщика, описан в §4.5.1. Тип объекта, представляющего диск, описан в §4.5.2.
3.1.1 Псевдонимы
Псевдоним — это альтернативное имя команды. Команда может иметь несколько псевдонимов, а исходное имя и все его псевдонимы можно использовать взаимозаменяемо. Псевдоним можно переназначить. Псевдоним — это элемент (§3.3).
Псевдоним можно назначить другому псевдониму; Однако новый псевдоним не является псевдонимом исходной команды.
Псевдоним поставщика — это плоское пространство имен, содержащее только объекты, представляющие псевдонимы. Переменные не имеют дочерних элементов.
PowerShell поставляется с набором встроенных псевдонимов.
Следующие командлеты имеют дело с псевдонимами:
- новый псевдоним: создает псевдоним
- Set-Alias: создает или изменяет один или несколько псевдонимов.
- Get-Alias: получает сведения об одном или нескольких псевдонимах.
- Export-Alias: Экспорт одного или нескольких псевдонимов в файл.
При создании псевдонима для команды с помощью New-Aliasпараметры этой команды нельзя включить в этот псевдоним. Однако прямое присваивание переменной в пространстве имен Alias позволяет включать параметры.
Заметка
Проще простого создать функцию, выполняющую только вызов этой команды с необходимыми параметрами, и присвоить этой функции псевдоним.
Тип объекта, представляющего псевдоним, описан в §4.5.4.
Объекты Alias хранятся на диске Alias: (§3.1).
3.1.2 Переменные среды
Поставщик среды PowerShell позволяет получать, добавлять, изменять, очищать и удалять переменные среды операционной системы.
Среда поставщика — это неструктурированное пространство имен, содержащее только объекты, представляющие переменные среды. Переменные не имеют дочерних элементов.
Имя переменной среды не может включать знак равенства (=).
Изменения переменных среды влияют только на текущий сеанс.
Переменная среды — это элемент (§3.3).
Тип объекта, представляющего переменную среды, описывается в §4.5.6.
Объекты переменной среды хранятся на диске Env: (§3.1).
Файловая система 3.1.3
Поставщик Файловой системы PowerShell позволяет создавать, открывать, изменять и удалять каталоги и файлы.
Провайдер файловой системы — это иерархическое пространство имен, которое содержит объекты, представляющие базовую файловую систему.
Файлы хранятся на дисках с такими именами, как A:, B:, C:, и т. д. (§3.1). Доступ к каталогам и файлам выполняется с помощью нотации пути (§3.4).
Каталог или файл — это элемент (§3.3).
Функции 3.1.4
Поставщик функций PowerShell позволяет получать, добавлять, изменять, очищать и удалять функции (§8.10) и фильтры (§8.10.1).
Функция поставщика — это неструктурированное пространство имен, содержащее только объекты функции и фильтра. Ни функции, ни фильтры не имеют дочерних элементов.
Изменения функций влияют только на текущий сеанс.
Функция — это элемент (§3.3).
Тип объекта, представляющего функцию, описывается в §4.5.10. Тип объекта, представляющего фильтр, описан в §4.5.11.
Объекты функций хранятся в функции диска: (§3.1).
3.1.5 Переменные
Переменные можно определить и управлять непосредственно на языке PowerShell.
Пространство имен поставщика Variable представляет собой неструктурированное пространство, содержащее только объекты, представляющие переменные. Переменные не имеют дочерних элементов.
Следующие командлеты также имеют дело с переменными:
- New-Variable: создает переменную
- Set-Variable: создает или изменяет характеристики одной или нескольких переменных.
- Get-Variable: возвращает сведения об одной или нескольких переменных.
- Clear-Variable: удаляет значение одной или нескольких переменных.
- Remove-Variable: удаляет одну или несколько переменных.
Так как переменная является элементом (§3.3), ей можно управлять большинством командлетов, связанных с элементами.
Тип объекта, представляющего переменную, описан в §4.5.3.
Объекты переменных хранятся в переменной диска: (§3.1).
3.2 Рабочие расположения
текущее рабочее расположение — это расположение по умолчанию, на которое указывают команды. Это расположение, используемое, если явный путь (§3.4) не предоставляется при вызове команды. Это расположение включает текущий диск.
В узле PowerShell может быть несколько дисков, в этом случае каждый диск имеет собственное текущее расположение.
Если имя диска указано без каталога, текущее расположение для этого диска подразумевается.
Текущее рабочее расположение можно сохранить в стеке, а затем задать новое расположение. Позже это сохраненное расположение можно восстановить из этого стека и сделать текущим рабочим местом. Существует два типа стеков расположений: стек рабочих расположений по умолчанию, а также ни одного или нескольких определяемых пользователем именованных стеков рабочих расположений. Когда сеанс начинается, стек рабочих расположений по умолчанию также является стеком текущего рабочего расположения. Однако любой именованный стек рабочих мест можно сделать текущим стеком рабочих мест.
Следующие командлеты имеют дело с расположениями:
- set-Location: устанавливает текущее рабочее расположение.
- : Get-Location определяет текущую рабочую директорию для указанных дисков или рабочие директории для указанных стеков.
- push-location: сохраняет текущее рабочее расположение в верхней части указанного стека расположений.
- Pop-Location: восстанавливает текущее рабочее местоположение из верхушки указанного стека местоположений.
Типы объектов, представляющие рабочее расположение и стек рабочих расположений, описаны в §4.5.5.
3.3 Элементы
Элемент — это псевдоним (§3.1.1), переменная (§3.1.5), функция (§0 3.1.4), переменная среды (§3.1.2), или файл или каталог в файловой системе (§3.1.3).
Следующие командлеты имеют дело с элементами:
- New-Item: создаёт новый элемент
- Set-Item: изменяет значение одного или нескольких элементов.
- get-Item: возвращает элементы в указанном расположении.
- Get-ChildItem: возвращает элементы и дочерние элементы в указанном расположении.
- : Копировать-Элемент: копирует один или несколько объектов из одного расположения в другое.
- Move-Item. Перемещает один или несколько элементов из одного расположения в другое
- Переименовать-Элемент: Переименовывает элемент
- Invoke-Item: выполняет действие по умолчанию для одного или нескольких элементов.
- Clear-Item: удаляет содержимое одного или нескольких элементов, но не удаляет сами элементы (см. раздел)
- Remove-Item: удаляет указанные элементы
Следующие командлеты имеют дело с содержимым элементов:
- Get-Content: возвращает содержимое элемента
- Add-Content: добавляет содержимое в указанные элементы.
- Set-Content: записывает или заменяет содержимое в элементе
- Clear-Content: удаляет содержимое элемента
Тип объекта, представляющего каталог, описан в §4.5.17. Тип объекта, представляющего файл, описан в §4.5.18.
3.4 Имена путей
Все элементы в хранилище данных, доступные через поставщик PowerShell, можно уникально идентифицировать их путевыми именами. Имя пути — это сочетание имени элемента, контейнера и подконтейнеров, в которых находится элемент, и диска PowerShell, через который осуществляется доступ к контейнерам.
Имена путей делятся на один из двух типов: полностью определённый и относительный. полное имя пути состоит из всех элементов, составляющих путь. В приведённом ниже синтаксисе показаны элементы полного имени пути:
Совет
Нотация ~opt~ в определениях синтаксиса указывает, что лексическая сущность является необязательной в синтаксисе.
path:
provider~opt~ drive~opt~ containers~opt~ item
provider:
module~opt~ provider ::
module:
module-name \
drive:
drive-name :
containers:
container \
containers container \
имя модуля относится к родительскому модулю.
поставщик ссылается на поставщика PowerShell, который используется для доступа к хранилищу данных.
диск ссылается на диск PowerShell, поддерживаемый определенным поставщиком PowerShell.
контейнер может содержать другие контейнеры, которые, в свою очередь, могут содержать другие контейнеры, и так далее, при этом последний контейнер содержит элемент. Контейнеры должны быть указаны в иерархическом порядке, в котором они существуют в хранилище данных.
Ниже приведен пример имени пути:
E:\Accounting\InvoiceSystem\Production\MasterAccount\MasterFile.dat
Если конечный элемент в пути содержит другие элементы, это элемент-контейнер; в противном случае — элемент-лист.
В некоторых случаях полное имя пути не требуется; достаточно относительного имени пути. Имя относительного пути основано на текущем рабочем месте. PowerShell позволяет определить элемент на основе его расположения относительно текущего рабочего расположения. Имя относительного пути подразумевает использование некоторых специальных символов. В следующей таблице описан каждый из этих символов и приведены примеры относительных имен путей и полностью квалифицированных имен путей. Примеры в таблице основаны на текущем рабочем каталоге, заданном для C:\Windows:
| символ | описание | относительный путь | полностью квалифицированный путь |
|---|---|---|---|
. |
Текущее рабочее расположение | .\System |
C:\Windows\System |
.. |
Родительский элемент текущего рабочего расположения | ..\Program Files |
C:\Program Files |
\ |
Корневой каталог диска текущей рабочей директории | \Program Files |
C:\Program Files |
| никакой | Специальные символы отсутствуют | System |
C:\Windows\System |
Чтобы использовать имя пути в команде, введите это имя в качестве полного или относительного имени пути.
Следующие командлеты имеют дело с путями:
- Convert-Path: преобразует путь из пути PowerShell в путь провайдера PowerShell.
- Join-Path: объединяет основной и подчиненный путь в один путь
- Resolve-Path: Обрабатывает подстановочные символы в пути
- разделенный путь: возвращает указанную часть пути.
- Test-Path: определяет, существуют ли элементы пути или правильно ли сформирован путь.
Некоторые командлеты (такие как Add-Content и Copy-Item) используют фильтры файлов. Фильтр файлов — это механизм для указания критериев выбора из набора путей.
Тип объекта, представляющий разрешенный путь, описан в §4.5.5. Пути часто обрабатываются как строки.
3.5 Области применения
Введение 3.5.1
Имя может обозначить переменную, функцию, псевдоним, переменную среды или диск. Одно и то же имя может указывать разные элементы в разных местах в скрипте. Для каждого элемента, который обозначен именем, это имя отображается только в пределах области текста скрипта, называемой его областью . Разные элементы, обозначаемые одинаковым именем, либо имеют разные области видимости, либо находятся в разных пространствах имен.
Области могут вкладываться, в этом случае внешние области называются родительскими областями, и все вложенные области дочерними областями этой родительской области. Область имени — это область, в которой оно определено, и все дочерние области, если оно не сделано приватным. В контексте дочерней области видимости имя, определенное в ней, скрывает любые элементы с тем же именем, определенные в родительских областях.
Если не используется точечная нотация исходного кода (§3.5.5), каждая из следующих ситуаций создает новую область видимости:
- Файл скрипта
- Блок скрипта
- Функция или фильтр
Рассмотрим следующий пример:
# Start of script
$x = 2; $y = 3
Get-Power $x $y
# Function defined in script
function Get-Power([int]$x, [int]$y) {
if ($y -gt 0) {
return $x * (Get-Power $x (--$y))
} else {
return 1
}
}
# End of script
Область переменных $x и $y, созданных в скрипте, является текстом этого скрипта, включая функцию, определенную внутри нее. Функция Get-Power определяет два параметра с теми же именами.
Так как каждая функция имеет собственную область, эти переменные отличаются от тех, которые определены в родительской области, и они скрывают их от родительской области. Область функции вложена в область скрипта.
Обратите внимание, что функция вызывает себя рекурсивно. Каждый раз, когда он делает это, он создает еще одну вложенную область, каждая из которых имеет собственные переменные $x и $y.
Ниже приведен более сложный пример, в котором также показаны вложенные области и повторное использование имен:
# start of script scope
$x = 2 # top-level script-scope $x created
# $x is 2
F1 # create nested scope with call to function F1
# $x is 2
F3 # create nested scope with call to function F3
# $x is 2
function F1 { # start of function scope
# $x is 2
$x = $true # function-scope $x created
# $x is $true
& { # create nested scope with script block
# $x is $true
$x = 12.345 # scriptblock-scope $x created
# $x is 12.345
} # end of scriptblock scope, local $x goes away
# $x is $true
F2 # create nested scope with call to function F2
# $x is $true
} # end of function scope, local $x goes away
function F2 { # start of function scope
# $x is $true
$x = "red" # function-scope $x created
# $x is "red"
} # end of function scope, local $x goes away
function F3 { # start of function scope
# $x is 2
if ($x -gt 0) {
# $x is 2
$x = "green"
# $x is "green"
} # end of block, but not end of any scope
# $x is still "green"
} # end of function scope, local $x goes away
# end of script scope
3.5.2 Имена областей действия и номера
PowerShell поддерживает следующие области:
Глобальный: это наиболее высокоуровневая область. Все автоматические и предпочтительные переменные определены в этой области. Глобальная область является родительской областью всех других областей, а все остальные области являются дочерними областями глобальной области.
Local: это текущая область в любой точке выполнения в скрипте, блоке скрипта или функции. Любая область может быть локальной областью.
Скрипт. Эта область существует для каждого исполняемого файла скрипта. Область скрипта является родительской областью всех областей, созданных в ней. Блок скрипта не имеет собственной области скрипта; вместо этого его область скрипта — это область ближайшего файла скрипта предка. Несмотря на отсутствие такой функции, как область модуля, область скрипта предоставляет эквивалент.
Имена могут быть объявлены закрытыми, в этом случае они не отображаются вне области их родителя, и даже дочерние области их не видят. Концепция `private` не является отдельной областью; это псевдоним для локальной области с функцией скрытия имени, если оно используется в качестве пространства для записи.
Области можно обозначать числом, описывающим относительное положение одной области относительно другой. Область 0 обозначает локальную область, область 1 обозначает область предка 1 поколения, область 2 обозначает область предка 2 поколения и т. д. (Номера областей используются командлетами, которые управляют переменными.)
3.5.3 Область действия имени переменной
Как показано в следующей постановке, имя переменной можно указать в одной из шести различных областей:
variable-scope:
Global:
Local:
Private:
Script:
Using:
Workflow:
variable-namespace
Область применения является необязательной. В следующей таблице показано значение каждого из всех возможных контекстов. Она также показывает область, если область не указана явным образом:
| модификатор области | в файле скрипта | в блоке скрипта | Внутри функции |
|---|---|---|---|
| Глобальный | Глобальная область | Глобальная область | Глобальная область |
| Сценарий | Область видимости ближайшего файла скрипта предка или глобальная область, если ближайший файл скрипта предка отсутствует. | Область видимости ближайшего файла скрипта предка или глобальная область, если ближайший файл скрипта предка отсутствует. | Область видимости ближайшего файла скрипта предка или глобальная область, если ближайший файл скрипта предка отсутствует. |
| Частный | Глобальная область, область скрипта, локальная область | Локальная область | Локальная область |
| Местный | Глобальная область, область скрипта, локальная область | Локальная область | Локальная область |
| Использование | Определенная реализация | Определенная реализация | Определенная реализация |
| Рабочий процесс | Определенная реализация | Определенная реализация | Определенная реализация |
| Отсутствует | Глобальная область, область скрипта, локальная область | Локальная область | Локальная область |
Сведения о области переменных также можно указать при использовании семейства командлетов, перечисленных в (§3.1.5). В частности, ознакомьтесь с параметром Scope, и параметрами Option Private и Option AllScope для получения дополнительных сведений.
Модификатор Using: области используется для доступа к переменным, определенным в другой области при выполнении скриптов с помощью таких командлетов, как Start-Job, Invoke-Commandили в инструкции inlinescript-. Например:
$a = 42
Invoke-Command --ComputerName RemoteServer { $Using:a } # returns 42
workflow foo
{
$b = "Hello"
inlinescript { $Using:b }
}
foo # returns "Hello"
Рабочий процесс области используется с параллельной инструкцией или последовательной инструкцией для доступа к переменной, определенной в ней.
Область имени функции 3.5.4
Имя функции также может иметь одну из четырех разных областей, а видимость этого имени совпадает с переменными (§3.5.3).
Нотация точечного источника 3.5.5
При выполнении файла скрипта, блока скрипта или функции из другого файла скрипта, блока скрипта или функции исполняемый файл скрипта создает новую вложенную область. Например
Script1.ps1
& "Script1.ps1"
& { ... }
FunctionA
Однако при использовании точечной нотации источника новая область не создается перед выполнением команды, поэтому добавления и изменения, внесённые в свою локальную область, вносятся в текущую область вместо этого. Например
. Script2.ps1
. "Script2.ps1"
. { ... }
. FunctionA
3.5.6 Модули
Как файл сценария верхнего уровня находится в корне дерева иерархической вложенной области, так и каждый модуль (§3.14). Однако по умолчанию только те имена, экспортируемые модулем, доступны по имени из контекста импорта. Глобальный параметр командлета Import-Module позволяет экспортированным именам иметь повышенную видимость.
3.6 Свойства только для чтения и константные
Переменные и псевдонимы описываются объектами, содержащими ряд свойств. Эти свойства задаются и управляются двумя семействами командлетов (§3.1.5, §3.1.1). Одно из таких свойств — Параметры, которые можно задать для ReadOnly или Constant (с помощью параметра Option). Переменная или псевдоним, помеченный ReadOnly, может быть удалена, а его свойства могут быть изменены, если указан параметр Force. Однако переменная или псевдоним, помеченные константой, не могут быть удалены или изменены его свойства.
3.7 Перегрузки методов и разрешение вызовов
Введение 3.7.1
Как указано в разделе 1, внешняя процедура, доступная средой выполнения (и написанная на каком-то языке, отличном от PowerShell), называется методом .
Имя метода вместе с числом и типами его параметров совместно называются сигнатурой этого метода. (Обратите внимание, что сигнатура не включает тип возвращаемого метода.) Среда выполнения может разрешить типу иметь несколько методов с одинаковым именем, при условии, что у каждого из них разная сигнатура. При определении нескольких версий некоторых методов этот метод считается перегруженным. Например, тип Math (§4.3.8) содержит набор методов, называемых Abs, который вычисляет абсолютное значение указанного числа, где указанное число может иметь одно из нескольких типов. Методы в этом наборе имеют следующие сигнатуры:
Abs(decimal)
Abs(float)
Abs(double)
Abs(int)
Abs(long)
Abs(SByte)
Abs(Int16)
В этом случае все методы имеют одинаковое количество аргументов; их сигнатуры различаются только по типу аргумента.
Другой пример включает массив типов (§4.3.2), который содержит набор методов с именем Copy, который копирует диапазон элементов из одного массива в другой, начиная с начала каждого массива (по умолчанию) или в определенном элементе. Методы в этом наборе имеют следующие сигнатуры:
Copy(Array, Array, int)
Copy(Array, Array, long)
Copy(Array, int, Array, int, int)
Copy(Array, long, Array, long, long)
В этом случае подписи отличаются по типу аргумента и в некоторых случаях по числу аргументов.
В большинстве вызовов перегруженных методов число и тип аргументов, передаваемых точно соответствуют одному из перегрузок, и выбранный метод очевиден. Тем не менее, если это не так, должен быть способ определить, какую перегруженную версию необходимо вызвать, если таковая существует. Например
[Math]::Abs([byte]10) # no overload takes type byte
[array]::Copy($source, 3, $dest, 5L, 4) # both int and long indexes
Другие примеры включают тип строка (т. е. System.String), который имеет множество перегруженных методов.
Хотя PowerShell имеет правила для разрешения вызовов методов, которые не соответствуют перегруженной сигнатуре точно, PowerShell не предоставляет способ определения перегруженных методов.
Заметка
Примечание редактора: PowerShell 5.0 добавила возможность определять классы на основе скриптов. Эти классы могут содержать перегруженные методы.
3.7.2 Разрешение перегрузки метода
При вызове метода (§7.1.3) со списком выражений аргументов и набором кандидатов методов(т. е. тех методов, которые могут быть вызваны), механизм выбора наилучшего метода называется разрешение перегрузки методов.
Учитывая набор применимых методов-кандидатов (§3.7.3), выбирается лучший метод из этого набора. Если набор содержит только один метод, то этот метод является лучшим методом. В противном случае лучший метод — это тот метод, который лучше, чем все остальные методы в отношении заданного списка аргументов, используя правила, показанные в §3.7.4. Если нет ровно одного метода, который лучше всех остальных методов, вызов метода является неоднозначным и сообщается об ошибке.
Лучший метод должен быть доступен в контексте, в котором он вызывается. Например, скрипт PowerShell не может вызывать метод, который является частным или защищенным.
Наилучшим способом для вызова статического метода является использование статического метода, а для вызова метода экземпляра — использование метода экземпляра.
3.7.3 Применимый метод
Как говорят, метод применим относительно списка аргументов A, когда одно из следующих утверждений является истинным:
- Число аргументов в A идентично количеству параметров, которые принимает метод.
- Метод имеет обязательные параметры M и необязательные параметры N, а число аргументов в A больше или равно M, но меньше N.
- Метод принимает переменное число аргументов, а число аргументов в A больше числа параметров, которые принимает метод.
Помимо наличия соответствующего количества аргументов, каждый аргумент в A должен соответствовать режиму передачи параметров аргумента, а тип аргумента должен совпадать с типом параметра или должен быть преобразование из типа аргумента в тип параметра.
Если тип аргумента равен ref (§4.3.6), соответствующий параметр также должен быть ref, а тип аргумента для целей преобразования — это тип свойства Value из аргумента ref.
Если тип аргумента ref, соответствующий параметр может быть out вместо ref.
Если метод принимает переменное число аргументов, этот метод может применяться в обычной форме или развернутой форме. Если число аргументов в A идентично количеству параметров, которые принимает метод, и последний параметр является массивом, форма зависит от ранга одного из двух возможных преобразований:
- Ранг преобразования из типа последнего аргумента в A в тип массива для последнего параметра.
- Ранг преобразования из типа последнего аргумента в A в тип элемента типа массива для последнего параметра.
Если первое преобразование (в тип массива) лучше второго преобразования (в тип элемента массива), то метод применяется в обычной форме, в противном случае применимо в развернутой форме.
Если есть больше аргументов, чем параметры, метод может применяться только в развернутой форме. Для применения в развернутой форме последний параметр должен иметь тип массива. Метод заменяется эквивалентным методом, который имеет последний параметр, замененный достаточными параметрами для учета каждого несовпадного аргумента в A. Каждый дополнительный тип параметра — это тип элемента типа массива для последнего параметра в исходном методе. Приведенные выше правила для применимого метода применяются к этому новому методу и списку аргументов A.
Метод 3.7.4 Улучшенный
Учитывая список аргументов A с набором выражений аргументов { E~1~, E~2~, ..., E~N~ } и два метода приложения M~P~ и M~Q~ с типами параметров { P~1~, P~2~, ..., P~N~ } и { Q~1~, Q~2~, ..., Q~N~ }, M~P~ определяется как лучший метод, чем M~Q~, если накопительный рейтинг преобразований для M~P~ лучше, чем для M~Q~.
Совокупный рейтинг преобразований вычисляется следующим образом. Каждое преобразование стоит по-разному в зависимости от количества параметров, при преобразовании E~1~ стоит N, E~2~ стоит N-1, вплоть до E~N~ стоимостью 1. Если преобразование из E~X~ в P~X~ лучше, чем от E~X~ до Q~X~, M~P~ накапливает N-X+1; в противном случае M~Q~ накапливает N-X+1. Если M~P~ и M~Q~ имеют одинаковое значение, то используются следующие правила разрешения ничьей, которые применяются в следующем порядке:
- Совокупный рейтинг преобразований между типами параметров (игнорирующими типы аргументов) вычисляется таким образом, как и предыдущий рейтинг, поэтому
P~1~сравнивается сQ~1~,P~2~противQ~2~, ...иP~N~противQ~N~. Сравнение пропускается, если аргумент был$nullили если типы параметров не являются числовыми. Сравнение также пропускается, если преобразование аргументовE~X~теряет информацию при преобразовании вP~X~, но не теряет информацию при преобразовании вQ~X~или наоборот. Если сравниваются типы преобразования параметров, то если преобразование изP~X~вQ~X~лучше, чем отQ~X~доP~X~,M~P~накапливает N-X+1; в противном случаеM~Q~накапливает N-X+1. Это правило разбиения связи предназначено для того, чтобы предпочесть наиболее конкретный метод (т. е. метод с параметрами с наименьшими типами данных), если данные не потеряны в преобразованиях, или предпочесть наиболее общий метод (т. е. метод с параметрами с самыми большими типами данных), если преобразования приводят к потере информации. - Если оба метода используют развернутую форму, метод с большими параметрами является лучшим методом.
- Если один из методов использует развернутую форму, а другой использует обычную форму, метод, использующий обычную форму, является лучшим методом.
3.7.5 Улучшенное преобразование
Приведенный ниже текст относится к Windows PowerShell.
Преобразования ранжируются следующим образом: от самого низкого до самого высокого:
-
T~1~[]вT~2~[], где не существует назначаемого преобразования междуT~1~иT~2~ - Преобразование T в строку, где T может быть любым типом.
-
T~1~доT~2~, гдеT~1~илиT~2~определяют пользовательское преобразование в определяемым реализацией способом -
T~1~доT~2~, гдеT~1~реализует IConvertible - От
T~1~кT~2~, гдеT~1~илиT~2~реализуют методT~2~ op_Implicit(T1) - От
T~1~кT~2~, гдеT~1~илиT~2~реализуют методT~2~ op_Explicit(T1) - От
T~1~доT~2~, гдеT~2~реализует конструктор, принимающий один аргумент типаT~1~ - Одно из следующих преобразований:
- строка для
T, гдеTреализует статический методT Parse(string)илиT Parse(string, IFormatProvider) -
T~1~вT~2~, гдеT~2~является любым перечислением, аT~1~может быть строкой или коллекцией объектов, которые могут быть преобразованы в строку.
- строка для
-
Tв PSObject, гдеT— любой тип - Любое из следующих преобразований:
Language- T для bool, где
Tявляется любым числовым типом - строка в
T, гдеTестьregex,wmisearcher,wmi,wmiclass,adsi,adsisearcherилиtype - от
Tдоbool - T~1~ до
Nullable[T~2~], где осуществляется преобразование изT~1~вT~2~ -
Tв пустоту -
T~1~[]доT~2~[], где существует допустимое преобразование междуT~1~иT~2~ -
T~1~, доT~2~[], гдеT~1~является коллекцией - от
IDictionaryдоHashtable - от
Tдоref - от
Tдоxml - от
scriptblockдоdelegate -
T~1~T~2~, гдеT~1~является целым типом иT~2~является перечислением
- T для bool, где
-
$nullT, гдеTявляется любым типом значения -
$nullдляT, гдеTявляется любым ссылочным типом - Любое из следующих преобразований:
байт в
T, гдеTявляетсяSByteUInt16кT, гдеT— этоSByte,byteилиInt16Int16доT, гдеT— этоSByteилиbyteUInt32T, гдеTSByte,byte,Int16,UInt16илиintintT, гдеTявляетсяSByte,byte,Int16илиUInt16UInt64T, гдеTSByte,byte,Int16,UInt16,int,UInt32илиlonglongдоT, гдеTSByte,byte,Int16,UInt16,intилиUInt32floatT, гдеTявляется любым целым типом илиdecimaldoubleT, гдеTявляется любым целым типом илиdecimaldecimalвT, гдеTявляется любым целочисленным типом
- Любое из следующих преобразований:
-
SByteT, гдеTявляетсяbyte,uint6,UInt32илиUInt64 -
Int16кT, гдеT— этоUInt16,UInt32илиUInt64 -
intдоT, гдеT— этоUInt32илиUInt64 - от
longдоUInt64 -
decimalдоT, гдеT— этоfloatилиdouble
-
- Любое из следующих преобразований:
- От
Tдоstring, гдеT— любой числовой тип. - От
Tдоchar, гдеT— любой числовой тип. - От
stringдоT, гдеT— любой числовой тип.
- От
- Любое из следующих преобразований, эти преобразования считаются назначаемыми преобразованиями:
-
byteT, гдеTInt16,UInt16,int,UInt32,long,UInt64,single,doubleилиdecimal -
SByteT, гдеTInt16,UInt16,int,UInt32,long,UInt64,single,doubleилиdecimal -
UInt16T, гдеTint,UInt32,longилиUInt64,single,doubleилиdecimal -
Int16T, гдеTint,UInt32,longилиUInt64,single,doubleилиdecimal -
UInt32T, гдеTlongилиUInt64,single,doubleилиdecimal -
intT, гдеTlong,UInt64,single,doubleилиdecimal - от
singleдоdouble
-
-
T~1~,T~2~, гдеT~2~является базовым классом или интерфейсомT~1~. Это преобразование считается назначаемым преобразованием. - от
stringдоchar[] -
TвT, это преобразование считается присваиваемым преобразованием.
Для каждого преобразования формы T~1~ в T~2~[], где T~1~ не является массивом и никакое другое преобразование не применяется, если существует преобразование из T~1~ в T~2~, уровень этого преобразования хуже, чем уровень преобразования из T~1~ в T~2~, но лучше, чем любое преобразование, ранг которого ниже, чем преобразование из T~1~ в T~2~.
Поиск имен 3.8
Команды разных типов могут иметь одно и то же имя. Порядок, в котором выполняется поиск имен в таком случае, — псевдоним, функция, командлет и внешняя команда.
Поиск имени типа 3.9
§7.1.10 содержит инструкцию: "тип-литерал представлен в реализации некоторым неопределенным базовым типом." В результате имя типа является синонимом его базового типа". Примерами типов являются int, double, long[]и Hashtable.
Имена типов совпадают следующим образом: сравните заданное имя типа со списком встроенных акселераторов типов , например int, long, double. Если совпадение найдено, то это тип. В противном случае предположите, что имя типа является полностью квалифицированным, и проверьте, существует ли такой тип в системе хоста. Если совпадение найдено, то это тип. В противном случае добавьте префикс пространства имен System.. Если совпадение найдено, то это тип. В противном случае имя типа ошибочно. Этот алгоритм применяется для каждого аргумента типа для универсальных типов. Однако нет необходимости указывать arity (количество аргументов или операндов, принятых функцией или оператором).
3.10 Автоматическое управление памятью
Различные операторы и командлеты приводят к выделению памяти для объектов ссылочного типа, таких как строки и массивы. Выделение и освобождение этой памяти управляется системой среды выполнения PowerShell. То есть PowerShell предоставляет автоматическую сборку мусора.
3.11 Порядок выполнения
Побочный эффект — это изменение состояния окружения выполнения команды. Изменение значения переменной (с помощью операторов назначения или операторов предварительного и последующего увеличения и уменьшения) является побочным эффектом, как изменение содержимого файла.
Если не указано иное, утверждения выполняются в лексическом порядке.
Кроме того, как указано для некоторых операторов, порядок оценки терминов в выражении и порядок, в котором происходят побочные эффекты, не указаны.
Выражение, вызывающее команду, включает выражение, указывающее команду, и ноль или несколько выражений, которые определяют аргументы, значения которых передаются этой команде. Порядок вычисления этих выражений относительно друг друга не определен.
Обработка ошибок 3.12
Если команда завершается ошибкой, это считается ошибкой , а сведения об этой ошибке записываются в записи об ошибке, тип которого не указан (§4.5.15); однако этот тип поддерживает подстроку.
Ошибка попадает в одну из двух категорий. Либо операция завершается (ошибка типа - завершающая), либо нет (ошибка типа - незавершающая). При фатальной ошибке ошибка регистрируется, и операция прекращается. При не прерывающей выполнение ошибке ошибка записывается, и операция продолжается.
Ошибки, не приводящие к завершению исполнения, записываются в поток ошибок. Хотя эти сведения можно перенаправить в файл, объекты ошибок сначала преобразуются в строки и важные сведения в этих объектах не будут записываться, что затрудняет диагностику, если не невозможно. Вместо этого текст ошибки можно перенаправить (§7.12), а объект ошибки сохранить в переменной, как в $Error1 = command 2>&1.
Автоматическая переменная $Error содержит коллекцию записей об ошибках, представляющих последние ошибки, и последняя ошибка находится в $Error[0]. Эта коллекция сохраняется в буфере, так что старые записи удаляются при добавлении новых записей. Автоматическая переменная $MaximumErrorCount управляет количеством записей, которые можно сохранить.
$Error содержит все ошибки из всех команд, слитых вместе в одной сборке. Чтобы собрать ошибки из определенной команды, используйте общий параметр ErrorVariable, который позволяет указать определяемую пользователем переменную для хранения коллекции.
3.13 Трубопроводы
Конвейер — это последовательность одной или нескольких команд, разделенных оператором конвейера | (U+007C).
Каждая команда получает входные данные от своего предшественника и записывает выходные данные в своего преемника. Если результат в конце конвейера не удаляется или не перенаправляется в файл, он отправляется в хост-среду, которая может записать его в стандартный вывод. Команды в конвейере также могут получать входные данные из аргументов. Например, рассмотрим следующее использование команд Get-ChildItem, Sort-Objectи Process-File, которые создают список имен файлов в определенном каталоге файловой системы, сортируют набор текстовых записей и выполняют некоторую обработку в текстовой записи соответственно:
Get-ChildItem
Get-ChildItem E:*.txt | Sort-Object -CaseSensitive | Process-File >results.txt
В первом случае Get-ChildItem создает коллекцию имен файлов в текущем или стандартном каталоге. Эта коллекция отправляется в среду узла, которая по умолчанию записывает значение каждого элемента в стандартные выходные данные.
Во втором случае Get-ChildItem создает коллекцию имен файлов в указанном каталоге с помощью аргумента E:*.txt. Эта коллекция записывается в команду Sort-Object, которая по умолчанию сортирует их в порядке возрастания с учетом регистра (благодаря аргументу CaseSensitive). Результирующая коллекция записывается в команду Process-File, которая выполняет некоторую (неизвестную) обработку. Затем выходные данные этой команды перенаправляются в файл results.txt.
Если команда записывает один объект, то её преемник получает этот объект и завершает работу после записи собственных объектов своему преемнику. Однако если команда записывает несколько объектов, они доставляются одновременно в команду преемника, которая выполняется один раз для каждого объекта. Это поведение называется стримингом. При потоковой обработке объекты записываются по конвейеру сразу после того, как они становятся доступными, а не при создании всей коллекции.
При обработке коллекции можно записать команду таким образом, чтобы она может выполнять специальную обработку до начального элемента и после окончательного элемента.
3.14 Модули
Модуль — это автономная единица повторного использования, которая позволяет секционировать, упорядочивать и абстрагировать код PowerShell. Модуль может содержать команды (такие как командлеты и функции) и элементы (например, переменные и псевдонимы), которые можно использовать в качестве одной единицы.
После создания модуль необходимо импортировать в сеанс, прежде чем можно будет использовать команды и элементы в нем. После импорта команды и элементы ведут себя так, как если бы они были определены локально. Модуль импортируется явным образом с помощью команды Import-Module. Модуль также может быть импортирован автоматически, как определено в определенной реализации.
Тип объекта, представляющего модуль, описан в §4.5.12.
Модули подробно рассматриваются в §11.
3.15 Подстановочные знаки
Выражение подстановочного знака может содержать ноль или несколько следующих элементов:
| Элемент | Описание |
|---|---|
| Символ, отличный от *, ?или [ | Соответствует одному символу |
| * | Соответствует нулю или нескольким символам. Чтобы соответствовать символу *, используйте [*]. |
| ? | Соответствует одному символу. Как сопоставить? для символа используйте [?]. |
| [установить] | Соответствует одному символу из набора , который не может быть пустым. Если набор начинается с ], то правая квадратная скобка считается частью набора , а следующая правая квадратная скобка завершает набор; в противном случае первая правая квадратная скобка завершает набор. Если набор начинается или заканчивается на "-", то этот дефис-минус считается частью набора; в противном случае он указывает на диапазон последовательных кодовых позиций Юникода, где символы по обе стороны от дефиса-минуса являются граничными точками включенного диапазона. Например, A-Z указывает 26 прописных английских букв, а 0–9 — 10 десятичных цифр. |
Заметка
Дополнительную информацию см. в "Базовые спецификации Open Group: Сопоставление шаблонов", IEEE Std 1003.1, 2004 Edition.. Однако в PowerShell экранный символ имеет обратную черту, а не обратную косую черту.
3.16 Регулярные выражения
Регулярное выражение может содержать ноль или несколько следующих элементов:
| Элемент | Описание |
|---|---|
| Символ, отличный от ., [, ^, *, $, или \ | Соответствует одному символу |
| . | Соответствует одному символу. Для сопоставления. символ, используйте \.. |
| [установить] [^задать] |
Форма [множество] соответствует любому символу из множество. Форма [^набора] не совпадает ни с одним символом из набора. Набор не может быть пустым. Если множество начинается с ] или ^], то правая квадратная скобка считается частью множества, а следующая правая квадратная скобка завершает множество; в противном случае первая квадратная скобка справа завершает множество. Если набор начинается с - или ^-, или заканчивается на -, то дефис-минус считается частью набор; в противном случае он указывает на диапазон последовательных кодовых точек Юникода, где символы по обе стороны от дефис-минуса являются включающими разделителями диапазона. Например, A-Z указывает 26 прописных английских букв, а 0–9 — 10 десятичных цифр. |
| * | Соответствует нулю или более раз предыдущего элемента. |
| + | Соответствует одному или более вхождений предыдущего элемента. |
| ? | Соответствует нулю или одному вхождению предыдущего элемента. |
| ^ | Совпадения, которые находятся в начале строки. Чтобы соответствовать символу ^, используйте \^. |
| $ | Совпадения находятся в конце строки. Чтобы соответствовать символу $, используйте $. |
| \ c | Экранирует символ c, поэтому он не распознается как элемент регулярного выражения. |
Заметка
Дополнительные сведения см. в разделе Спецификации базы открытых групп: регулярные выражения, IEEE Std 1003.1, 2004 Edition..
Windows PowerShell: классы символов, доступные в регулярных выражениях Microsoft .NET Framework, поддерживаются следующим образом:
| Элемент | Описание |
|---|---|
\p{name} |
Соответствует любому символу из именованного класса символов, указанного по имени. Поддерживаемые имена — это группы Юникода и диапазоны блоков, такие как Ll, Nd, Z, IsGreek и IsBoxDrawing. |
\P{name} |
Сопоставляет текст, не включённый в группы и диапазоны блоков, указанные в имении |
\w |
Соответствует любому символу слова. Эквивалентно категориям символов Юникода [\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]. Если поведение, совместимое с ECMAScript, указано с параметром ECMAScript, \w эквивалентно [a-zA-Z_0-9]. |
\W |
Соответствует любому небуквенному символу. Эквивалентно категориям Юникода [\^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]. |
\s |
Соответствует любому символу пробела. Эквивалентно категориям символов Юникода [\f\n\r\t\v\x85\p{Z}]. |
\S |
Соответствует любому символу, отличному от пробела. Эквивалентно категориям символов Юникода [\^\f\n\r\t\v\x85\p{Z}]. |
\d |
Соответствует любой десятичной цифре. Эквивалентно \p{Nd} для Юникода и [0-9] для поведения, отличного от Юникода. |
\D |
Соответствует любому нецифровому символу. Эквивалентно \P{Nd} для Юникода и [\^0-9] для поведения, отличного от Юникода. |
Квантификаторы, доступные в регулярных выражениях Microsoft .NET Framework, поддерживаются следующим образом:
| Элемент | Описание |
|---|---|
* |
Указывает ноль или больше совпадений; например, \w* или (abc)*. Эквивалент {0,}. |
+ |
Соответствует повторяющимся экземплярам предыдущих символов. |
? |
Указывает ноль или одно совпадение; например, \w? или (abc)?. Эквивалентно {0,1}. |
{n} |
Указывает точно n совпадений; например, (pizza){2}. |
{n,} |
Указывает по крайней мере n совпадений; например, (abc){2,}. |
{n,m} |
Указывает по крайней мере n, но не более m, соответствует. |