【问题标题】:how to use "if" statements inside pipeline如何在管道中使用“if”语句
【发布时间】:2011-08-14 03:54:21
【问题描述】:

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

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

我的意思是,例如:

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

如何在管道内部使用if来开启/关闭过滤器?可能吗?有意义吗?

谢谢

编辑澄清

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

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

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

【问题讨论】:

  • 我想你的意思是写:get-something | ? { $_.someone -eq 'somespecific' } |格式表你有 ( 和 ) 而不是 { 和 }。
  • @x0n:你说得对,我刚刚更正了错误代码。谢谢
  • 其他答案请参见stackoverflow.com/a/20123883/223837。

标签: powershell pipeline conditional-statements statements


【解决方案1】:

我不知道我的回答能不能帮到你,但我试试:)

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

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

【讨论】:

  • 谢谢,但它看起来像一个过滤器1..10 | ? {($_ % 2) -eq 0}
  • 恐怕我不明白你的问题。对不起。
  • '% {...}' 中的% 是什么意思?谢谢。
  • @NoChance 等人,它是 Foreach-Object、more here 的简写。
【解决方案2】:

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

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

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

这就是你要找的吗?

【讨论】:

  • 您好,请仔细阅读您的答案并尝试一些愚蠢的测试,我发现它很有用。谢谢。我将编辑我的原始问题,插入一些关于如何使用这种逻辑的说明。
  • 酷,很高兴能帮上忙。它既好又紧凑,如果有点不清楚它在做什么。 :) 我现在对您正在尝试做的事情有了更多的了解,因为我看到您想要在管道中链接多个潜在的过滤器。好主意。 :)
  • 不错。我在提供参数时过滤值时使用了这种方法,而如果未提供参数则忽略过滤器:Where-Object { -not $Path -or $_.Path -like $Path }
【解决方案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

【讨论】:

  • 谢谢,但是在你的例子中没有办法命令过滤。
  • 不确定你的意思,但你可以像函数一样为过滤器设置参数。这样您就可以更好地控制过滤器的工作方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2015-01-26
  • 2020-06-23
  • 2020-12-02
相关资源
最近更新 更多