Where() и ForEach()

В Windows PowerShell 4.0 среди инструментов работы с массивами появились еще два — методы Where и ForEach.

Как известно, подобная функциональность уже представлена комадлетами Where-Object и ForEach-Object, однако в этом случае мы имеем более лаконичный код, а также некоторые дополнительные возможности.

Where()

Для начала давайте создадим массив каких-нибудь объектов, например, процессов.

$ps = Get-Process

Теперь давайте отфильтруем его содержимое при помощи метода массива Where()

$ps.Where({$_.name -like "power*"})

На выходе мы должны получить список процессов, имена которых начинаются с «power». Полагаю, скорее всего это будут разновидности powershell :)

Однако, на этом возможности Where() не заканчиваются.

Вторым аргументом мы можем указать режим работы метода. Этот аргумент принимает значения типа [System.Management.Automation.WhereOperatorSelectionMode], среди которых Default, First, Last, SkipUntil, Until и Split.
(Подробнее здесь: https://msdn.microsoft.com/en-us/library/system.management.automation.whereoperatorselectionmode%28v=vs.85%29.aspx)

Третьим аргументом мы можем задать количество выводимых результатов. Вкупе с вышеперечисленными режимами, это предоставляет нам достаточно широкие возможности для фильтрации.

Давайте подробнее рассмотрим значения второго аргумента.

Default — значение по-умолчанию. Обычно оно соответствует значению First.

First — указывает, что следует вывести первое совпадение. В случае указания третьего аргумента, будет выведено заданное количество результатов, начиная с первого совпадения.

$ps.Where({$_.name -like "power*"},"First")
$ps.Where({$_.name -like "power*"},"First",3)

Last — в отсутствие третьего аргумента выводится последнее совпадение. В случае же его наличия — выводится заданное число результатов из конца списка совпадений. (Например, последние 3)

$ps.Where({$_.name -like "power*"},"Last")
$ps.Where({$_.name -like "power*"},"Last",3)

SkipUntil — Пропускаются элементы до первого совпадения, после чего выводится сам совпадающий элемент и все остальные из списка, вне зависимости, соответствуют они фильтру или нет. При указании количества результатов, будет выведен совпадающий и последующие элементы, общим числом не превышающие указанного значения. (Например, в следующем примере будет выведен первый элемент и 2 последующих).

$ps.Where({$_.name -like "power*"},"SkipUntil")
$ps.Where({$_.name -like "power*"},"SkipUntil",3)

Until — Будут выводится элементы с начала списка, вне зависимости от соответствия фильтру, до того, как встретится первый объект, удовлетворяющий условию. При этом сам он не выводится. В случае указания количества, выводится объекты с начала списка до элемента, удовлетворяющего условию, но не более указанного количества. (Например, если соответствующий фильтру объект является 15-ым, а в качестве третьего параметра указано 3, то будет выведено 3 первых объекта списка.)

$ps.Where({$_.name -like "power*"},"Until")
$ps.Where({$_.name -like "power*"},"Until",3)

Split — В этом случае результатом команды будет являться массив, состоящих из двух элементов (тоже массивов). В первом будут объекты, соответствующие условию, во втором — все остальные. В случе указания третьего параметра — в первом элементе результирующего массива будет указанное число совпадающих элементов, а во втором — не водшедшие в первый совпадающие элементы, а также все остальные.

$ps.Where({$_.name -like "power*"},"Split")
$ps.Where({$_.name -like "power*"},"Split",3)

ForEach()

Метод ForEach() принимает два аргумента — expression, т.е. некоторое выражение, указывающее, что именно мы хотим сделать с каждым из элементов массива, и arguments — аргументы к заданному в первом параметре выражению.

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

$ps.ForEach({$_.name})
$ps.ForEach({"{0,-30} {1,10:N1} MB" -f $_.name, $($_.ws/1MB)})

Но можем и указать.
Например, так.

$ps.ForEach({Param($Denominator); "{0,-30} {1,10:N1} $Denominator" -f $_.name, $($_.ws/$("1"+$Denominator))}, "KB")

Или так.

$scale = "KB"
$ps.ForEach({Param($Denominator); "{0,-30} {1,10:N1} $Denominator" -f $_.name, $($_.ws/$("1"+$Denominator))}, $scale)

Или вот так.

$scale = "KB"
$expression = {Param($Denominator); "{0,-30} {1,10:N1} $Denominator" -f $_.name, $($_.ws/$("1"+$Denominator))}
$ps.ForEach($expression, $scale)

Страницы в социальных сетях:

Twitter: https://twitter.com/vsseth
Facebook: https://fb.com/inpowershell
VKontakte: https://vk.com/inpowershell


Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s