как использовать операторы "if" внутри конвейера
Я пытаюсь использовать if
внутри трубопровода.
Я знаю, что есть where
(псевдоним ?
) фильтр, но что, если я хочу активировать фильтр, только если выполняется определенное условие?
Я имею в виду, например:
get-something | ? {$_.someone -eq 'somespecific'} | format-table
как использовать if
внутри трубопровода для того чтобы переключить фильтр включено-выключено? Возможно ли это? В этом есть смысл?
спасибо
отредактировано для уточнения
без трубопровод будет выглядеть так:
if($filter) { get-something | ? {$_.someone -eq 'somespecific'} } else { get-something }
редактировать после ответа riknik
глупый пример, показывающий, что я искал. У вас есть денормализованная таблица данных, хранящихся в переменной $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
и вы поймете, что я имею в виду.
3 ответов
при использовании where-object условие не должно быть строго связано с объектами, проходящими через конвейер. Поэтому рассмотрим случай, когда иногда мы хотели фильтровать нечетные объекты, но только если было выполнено какое-то другое условие:
$filter = $true
1..10 | ? { (-not $filter) -or ($_ % 2) }
$filter = $false
1..10 | ? { (-not $filter) -or ($_ % 2) }
это то, что вы ищете?
Я не знаю, Может ли мой ответ помочь вам, но я пытаюсь:)
1..10 | % {if ($_ % 2 -eq 0) {$_}}
Как вы можете видеть, я использую цикл, и для каждого числа между 1 и 10 я проверяю, четно ли, и я показываю его только в этом случае.
вы пробовали создать свой собственный фильтр. (Глупый) пример:
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