как использовать операторы if внутри конвейера - PullRequest
15 голосов
/ 27 апреля 2011

Я пытаюсь использовать 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 ]

15 голосов
/ 28 апреля 2011

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

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

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

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

3 голосов
/ 28 апреля 2011

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

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
2 голосов
/ 28 апреля 2011

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

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

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

...