17

我正在尝试if在管道内使用。

我知道有where(别名?)过滤器,但是如果我只想在满足某个条件时才激活过滤器怎么办?

我的意思是,例如:

得到一些东西| ? {$_.someone -eq 'somespecific'} | 格式表

如何if在管道内部使用来打开/关闭过滤器?是否可以?是否有意义?

谢谢

编辑澄清

如果没有管道,它看起来像这样:

如果($过滤器){
 得到一些东西| ? {$_.someone -eq 'somespecific'}
}
别的 {
 取得一些东西
}

在回答 riknik 之后编辑

愚蠢的例子展示了我在寻找什么。您有一个存储在变量上的非规范化数据表,$data并且您想要执行一种“向下钻取”数据过滤:

功能数据过滤器{
参数([开关]$祖先,
    [开关]$父母,
    [开关]$孩子,
    [字符串]$myancestor,
    [字符串]$我的父母,
    [字符串]$我的孩子,
    [数组]$数据=[])

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

}

例如,如果我只想按特定父级过滤:

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

这是一种非常优雅、高效且简单的利用方式?。尝试做同样的事情if,你就会明白我的意思。

4

3 回答 3

15

使用 where-object 时,条件不必与通过管道的对象严格相关。因此,考虑一种情况,有时我们想过滤奇数对象,但前提是满足其他条件:

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

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

这是你要找的吗?

于 2011-04-27T21:06:54.560 回答
3

您是否尝试过创建自己的过滤器。(一个愚蠢的)例子:

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
于 2011-04-28T07:40:16.757 回答
2

我不知道我的回答是否能帮助你,但我试试:)

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

如您所见,我使用了一个循环,对于 1 到 10 之间的每个数字,我检查是否是偶数,并且仅在这种情况下显示它。

于 2011-04-27T20:02:23.987 回答