-match ...和|之间的区别其中{$ _ -match ...}

时间:2016-09-29 21:20:21

标签: arrays powershell

我一直试图想出这个问题一段时间,但我似乎无法弄清楚这两者之间的区别。特别是,它们与数据数组有关的差异:

PS C:>$myarray = "a", "ab", "abc"
PS C:>$myarray -match "b"
ab
abc
PS C:>$myarray | where {$_ -match "b"}
ab
abc

任何人都可以帮助我理解这两个选项之间的差异(如果有的话)吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

至少在结果中没有。一个是将一个比较运算符应用于一个数组(这意味着它应用于每个数组元素,并返回它返回$true的数组元素)。另一种是将数组传递给进行过滤的cmdlet。结果是一样的。

你可以通过另一种方式获得创意并解决同样的问题:

$myarray | foreach { if ($_ -match 'b') { $_ } }

但请注意,当左操作数不是数组时,结果不同:

PS Home:\> ,'b' -match 'b'
b
PS Home:\> 'b' -match 'b'
True

因此,如果你有一个变量,你不确定它是否是一个数组,你可以强迫它成为一个:

@($foo) -match 'b'

或使用Where-Object来做正确的事。

我个人倾向于在控制台编写PowerShell代码时直接使用运算符。它也很简洁grep等同于:

(gc file) -match 'regex'

(我应该更频繁地开始使用Select-String。)

但是在编写需要健壮的脚本或其他人必须阅读/维护的脚本时,我使用Where-Object的“正确”方式。

答案 1 :(得分:2)

  • $array -match 'value' - 直接检查每个值的字符串表示非常快(在大型数组中特别明显)
  • $array | where { $_ -match 'value' } - 对每个项目执行 scriptblock ,因此:
    • 调用开销(在大型数组上显着,可以减慢处理速度)
    • 灵活性和复杂条件
    • 属性可以使用
    • 可以执行额外的操作