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