我一直试图想出这个问题一段时间,但我似乎无法弄清楚这两者之间的区别。特别是,它们与数据数组有关的差异:
PS C:>$myarray = "a", "ab", "abc"
PS C:>$myarray -match "b"
ab
abc
PS C:>$myarray | where {$_ -match "b"}
ab
abc
任何人都可以帮助我理解这两个选项之间的差异(如果有的话)吗?
谢谢!
答案 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 ,因此: