как использовать операторы if внутри конвейера

Я пытаюсь использовать if внутри конвейера.

Я знаю, что есть фильтр where (псевдоним ?), но что, если я хочу активировать фильтр, только если выполняется определенное условие?

Я имею в виду, например:

get-something | ? {$_.someone -eq 'somespecific'} | format-table

Как использовать if внутри пайплайна для включения/выключения фильтра? Является ли это возможным? Имеет ли это смысл?

Спасибо

ОТРЕДАКТИРОВАНО для уточнения

Без пайплайна это выглядело бы так:

if($filter) {
 get-something | ? {$_.someone -eq 'somespecific'}
}
else {
 get-something
}

ИЗМЕНИТЬ после рикника ОТВЕТА

Глупый пример, показывающий, что я искал. У вас есть денормализованная таблица данных, хранящаяся в переменной $data, и вы хотите выполнить своего рода "детализацию" фильтрации данных:

function datafilter {
param([switch]$ancestor,
    [switch]$parent,
    [switch]$child,
    [string]$myancestor,
    [string]$myparent,
    [string]$mychild,
    [array]$data=[])

$data |
? { (!$ancestor) -or ($_.ancestor -match $myancestor) } |
? { (!$parent) -or ($_.parent -match $myparent) } |
? { (!$child) -or ($_.child -match $mychild) } |

}

Например, если я хочу фильтровать только по определенному родителю:

datafilter -parent -myparent 'myparent' -data $mydata

Это очень элегантный, эффективный и простой способ эксплуатации ?. Попробуйте сделать то же самое, используя if, и вы поймете, что я имею в виду.


person Emiliano Poggi    schedule 27.04.2011    source источник
comment
Я думаю, вы хотели написать: получить что-то | ? { $_.someone -eq 'какой-то конкретный' } | format-table У вас есть ( и ) вместо { и }.   -  person x0n    schedule 28.04.2011
comment
@ x0n: вы правы, я только что исправил неверный код. Спасибо   -  person Emiliano Poggi    schedule 28.04.2011
comment
См. stackoverflow.com/a/20123883/223837 для другого ответа.   -  person MarnixKlooster ReinstateMonica    schedule 21.11.2013


Ответы (3)


При использовании where-object условие не обязательно должно быть строго связано с объектами, которые проходят через конвейер. Итак, рассмотрим случай, когда иногда мы хотели отфильтровать нечетные объекты, но только если выполнялось какое-то другое условие:

$filter = $true
1..10 | ? { (-not $filter) -or ($_ % 2) }

$filter = $false
1..10 | ? { (-not $filter) -or ($_ % 2) }

Это то, что вы ищете?

person Daniel Richnak    schedule 27.04.2011
comment
Привет, прочитав ваш ответ более внимательно и попробовав какой-нибудь глупый тест, я нашел его полезным. Спасибо. Я собираюсь отредактировать свой первоначальный вопрос, добавив некоторые разъяснения о том, как можно использовать такую ​​логику. - person Emiliano Poggi; 28.04.2011
comment
Круто, рад, что смог помочь. Это красиво и компактно, хотя немного неясно, что он делает. :) Теперь я немного лучше понимаю, что вы пытаетесь сделать, теперь, когда я вижу, что вы хотите связать несколько потенциальных фильтров в конвейере. Неплохая идея. :) - person Daniel Richnak; 29.04.2011
comment
Ницца. Я использовал этот подход при фильтрации значений, когда параметр был предоставлен, игнорируя фильтр, если параметр не был предоставлен: Where-Object { -not $Path -or $_.Path -like $Path } - person craig; 22.02.2018

Пробовали ли вы создать свой собственный фильтр. (Глупый) пример:

filter MyFilter {
   if ( ($_ % 2) -eq 0) { Write-Host $_ }
   else { Write-Host ($_ * $_) }
}

PS> 1,2,3,4,5,6,7,8,9 | MyFilter
1
2
9
4
25
6
49
8
81
person Torbjörn Bergstedt    schedule 28.04.2011
comment
Спасибо, однако в вашем примере нет возможности фильтровать команды. - person Emiliano Poggi; 28.04.2011
comment
Не уверен, что вы имеете в виду, но у вас могут быть параметры для фильтров, как и для функции. Таким образом, вы лучше контролируете работу фильтра. - person Torbjörn Bergstedt; 29.04.2011

Не знаю, поможет ли мой ответ, но я попробую :)

1..10 | % {if ($_ % 2 -eq 0) {$_}} 

как видите, я использую цикл, и для каждого числа от 1 до 10 я проверяю, является ли оно четным, и отображаю его только в этом случае.

person Nicola Cossu    schedule 27.04.2011
comment
Спасибо, но это похоже на фильтр 1..10 | ? {($_ % 2) -eq 0} - person Emiliano Poggi; 28.04.2011
comment
Боюсь, тогда я не понимаю вашего вопроса. Извини. - person Nicola Cossu; 28.04.2011
comment
Что означает % в '% {...}'? Спасибо. - person NoChance; 24.09.2016
comment
@NoChance и др., это сокращение от Foreach-Object, подробнее здесь. - person Aaron; 31.05.2019