如何在管道内使用“if”语句

17

我正在尝试在管道中使用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做同样的事情,你会明白我的意思。


我认为你的意思是:get-something | ? { $_.someone -eq 'somespecific' } | format-table 你使用了 ( 和 ) 而不是 { 和 }。 - x0n
@x0n:你说得对,我刚刚纠正了误码。谢谢。 - Emiliano Poggi
请参见 https://dev59.com/s2gu5IYBdhLWcg3wDS0G#20123883 获取另一个答案。 - MarnixKlooster ReinstateMonica
3个回答

15

使用where-object时,条件并不一定严格与通过管道传递的对象相关。 因此,考虑一种情况,即有时我们想要过滤奇数对象,但仅在满足其他某些条件时才这样做:

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

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

这是你在寻找的吗?


嗨,仔细阅读了您的答案并尝试了一些愚蠢的测试,我发现它很有用。谢谢。我将编辑我的原始问题,插入一些关于如何使用这样的逻辑的澄清。 - Emiliano Poggi
很酷,很高兴能够帮到你。它很简洁,虽然有点不清楚它在做什么。:) 现在我更了解你尝试做什么了,现在我看到你想在管道中链接多个潜在的过滤器。好主意。:) - Daniel Richnak
不错。当参数被提供时,我使用了这种方法来过滤值,同时忽略了如果参数未被提供的情况下的过滤:Where-Object { -not $Path -or $_.Path -like $Path } - craig

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

谢谢,不过在你的例子中没有办法进行筛选命令。 - Emiliano Poggi
1
不确定您的意思,但是您可以像函数一样为过滤器设置参数。这样,您就可以更好地控制过滤器的工作方式。 - Torbjörn Bergstedt

2

我不确定我的回答能否帮到你,但我会尽力 :)

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

正如你所看到的,我使用循环遍历1到10之间的每个数字,检查它是否为偶数,并仅在这种情况下显示它。


谢谢,但看起来像是一个过滤器 1..10 | ? {($_ % 2) -eq 0} - Emiliano Poggi
抱歉,我不明白你的问题。 - Nicola Cossu
请问 '% {...}' 中的 % 是什么意思?谢谢。 - NoChance
@NoChance等人,这是“Foreach-Object”的速记方式,更多信息请参见此处 - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接