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

问题描述 投票:0回答:4

我正在尝试在管道内使用

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
做同样的事情,你就会明白我的意思。

powershell pipeline conditional-statements statements
4个回答
15
投票

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

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

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

这是您正在寻找的吗?


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

2
投票

我不知道我的回答是否可以帮助你,但我会尝试:)

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

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


0
投票

我想你问过这个:

$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 
© www.soinside.com 2019 - 2024. All rights reserved.