我正在尝试在管道内使用
if
。
我知道有
where
(别名 ?
)过滤器,但是如果我想仅在满足特定条件时激活过滤器怎么办?
我的意思是,例如:
得到一些东西| ? {$_.someone -eq '某些特定'} |格式表
如何使用管道内的
if
来开启/关闭过滤器?是否可以?有道理吗?
谢谢
已编辑澄清
如果没有管道,它看起来像这样:
如果($过滤器){ 得到一些东西 | ? {$_.someone -eq '某些特定'} } 别的 { 得到某物 }
在回答后编辑 riknik
愚蠢的例子显示了我在寻找什么。您有一个存储在变量
$data
上的非规范化数据表,并且您想要执行一种“向下钻取”数据过滤:
函数数据过滤器{ 参数([开关]$祖先, [切换]$父级, [切换]$孩子, [字符串]$myancestor, [字符串]$myparent, [字符串]$mychild, [数组]$数据=[]) $数据| ? { (!$ancestor) - 或 ($_.ancestor -match $myancestor) } | ? { (!$parent) - 或 ($_.parent -match $myparent) } | ? { (!$child) - 或 ($_.child -match $mychild) } | }
例如,如果我只想按特定父级进行过滤:
datafilter -parent -myparent 'myparent' -data $mydata
这是非常优雅、高效且简单的利用方式
?
。尝试使用 if
做同样的事情,你就会明白我的意思。
使用 where-object 时,条件不必严格与通过管道的对象相关。因此,考虑一种情况,有时我们想要过滤奇怪的对象,但前提是满足其他条件:
$filter = $true
1..10 | ? { (-not $filter) -or ($_ % 2) }
$filter = $false
1..10 | ? { (-not $filter) -or ($_ % 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
我不知道我的回答是否可以帮助你,但我会尝试:)
1..10 | % {if ($_ % 2 -eq 0) {$_}}
如你所见,我使用了一个循环,对于 1 到 10 之间的每个数字,我检查是否为偶数,并且仅在这种情况下显示它。
我想你问过这个:
$Test = @(
[string]'Its test text.'
[PSCustomObject]@{"ComputerName" = 'MyMachine'; "Status" = 'Ok'; "IP" = '10.10.10.30'}
)
$Test | ForEach-Object {
if ($_.GetType().Name -eq 'PSCustomObject') {
$_ | Select "ComputerName", "Status"
} else {
$_
}
}
PS>
Its test text.
ComputerName Status
------------ ------
MyMachine Ok