Where-*

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

Get-Command | Where-Object {$_.definition -like "*mapi*"}

Не очень сложно, и логично🙂 Но так как писать такую конструкцию приходится достаточно постоянно, это сильно надоедает. И учитывая что больше всего в таких случаях используются простые сравнения с помощью операторов -match, -like, и -eq, я написал несколько маленьких фильтров-оберток, просто для снижения количества набираемых спецсимволов🙂

filter Where-Match ([string]$Property="", [string]$Value=$(throw "You must specify value"), [switch]$Not)
{
	if($(if($Property){$_.$Property}else{$_}) -match $Value -xor $Not){$_}
}

filter Where-Like ([string]$Property="", [string]$Value=$(throw "You must specify value"), [switch]$Not)
{
	if($(if($Property){$_.$Property}else{$_}) -like $Value -xor $Not){$_}
}

filter Where-Equal ([string]$Property="", $Value=$(throw "You must specify value"), [switch]$Not)
{
	if($(if($Property){$_.$Property}else{$_}) -eq $Value -xor $Not){$_}
}

Эти фильтры можно поместить в профиль, для того чтобы не приходилось каждую сессию снова задавать их🙂 Используются же они так:

Get-Command | Where-Like definition *mapi*

или так (ключ -not указывает что следует инвертировать смысл функции, то есть в данном случае как бы используется -notlike):

Get-Process | Where-Like path c:\windows\* -not

Смотрим только запущенные сервисы…

Get-Service | Where-Equal status running

или только файлы с расширением .ps<цифра>

dir | Where-Match -value '\.ps\d'

Кроме того, для себя я сделал еще алиасы:

Set-Alias wm Where-Match
Set-Alias wl Where-Like
Set-Alias we Where-Equal
Опубликовано в Learn, PowerShell, Scripting, Tips. 2 комментария »

комментария 2 to “Where-*”

  1. Pavel Nagaev Says:

    В этих алиасах есть один большой минус — привыкнешь к ним и не сможешь потом без них🙂

    Конструкцию
    Where-Object {$_. -like }
    не так уж сложно и запомнить.

    Пост безусловно хорош.

  2. Xaegr Says:

    2 Pavel Nagaev: Запомнить то просто, но вот набирать wm куда проще🙂 Кстати можно набирать ? вместо Where-Object (это алиас).

    Привыкание это конечно беда, но у меня такие штуки в профиле, а он перемещается вместе со мной🙂 В скриптах просто привых неиспользовать даже нестандартных алиасов.

    Спасибо🙂


Обсуждение закрыто.

%d такие блоггеры, как: