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


about_упрощённый_синтаксис

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

Описывает более простые, более естественные способы написания скриптов для фильтрации коллекций объектов.

Длинное описание

Упрощенный синтаксис, представленный в Windows PowerShell 3.0, позволяет создавать некоторые команды фильтра без использования блокировок скриптов. Упрощенный синтаксис более тесно похож на естественный язык и в основном полезен в коллекциях объектов, которые передаются в команды Where-Object и ForEach-Object или соответствующие псевдонимы where и foreach.

Метод можно использовать для членов коллекции (чаще всего массива) без ссылки на автоматическую переменную $_ внутри скрипта.

Рассмотрим следующие два вызова:

Стандартный синтаксис

Get-ChildItem Cert:\LocalMachine\Root |
    Where-Object -FilterScript { $_.FriendlyName -eq 'Verisign' }
Get-ChildItem Cert:\ -Recurse |
    ForEach-Object -FilterScript { $_.GetKeyAlgorithm() }

Заметка

Во второй команде метод GetKeyAlgorithm вызывается для каждого объекта в коллекции. Если объект, полученный из конвейера, не имеет метода GetKeyAlgorithm, команда создает ошибку.

Упрощенный синтаксис

В упрощенном синтаксисе операторы сравнения, работающие над элементами объектов в коллекции, реализуются в качестве параметров. Кроме того, можно вызвать метод для объектов в коллекции без ссылки на автоматическую переменную $_ внутри скрипта. Сравните следующие два вызова со стандартными примерами синтаксиса:

Get-ChildItem Cert:\LocalMachine\Root |
    Where-Object -Property FriendlyName -EQ 'Verisign'
Get-ChildItem Cert:\ -Recurse |
    ForEach-Object -MemberName GetKeyAlgorithm

Поскольку параметры Property и MemberName являются позиционными, их можно опустить в команде. С помощью псевдонимов можно упростить следующие команды:

dir Cert:\LocalMachine\Root | where FriendlyName -EQ 'Verisign'
dir Cert:\ -Recurse | foreach GetKeyAlgorithm

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

Имя метода GetKeyAlgorithm передается в качестве аргумента для параметра MemberNameForEach-Object. При вызове метода с помощью упрощенного синтаксиса метод вызывается для каждого объекта в конвейере, только если этот объект имеет этот метод. Таким образом, вы получаете те же результаты, но без ошибок.

В следующем примере Description передается параметру MemberNameForEach-Object. Команда отображает описание каждого объекта System.Diagnostics.Process, возвращаемого Get-Process.

Get-Process | foreach Description

В этом примере имя метода GetFiles передается в параметр MemberName команды ForEach-Object. Значение .* передается параметру ArgumentList. Метод GetFiles() вызывается с параметром шаблона поиска .* для каждого объекта System.IO.DirectoryInfo, возвращаемого Get-ChildItem.

Get-ChildItem /home -Directory | foreach GetFiles .*

См. также