Powershell管道和正则表达式,评估顺序

时间:2014-01-29 07:51:28

标签: regex powershell pipeline

这段代码实际上有效,我很好奇我是否幸运(!?)并在Power Shell语言中发现了一个错误(这是伪代码,但它说明了我的问题):

$regex = "prefix([0-9]+)"
$collection = Get-Collection | Where-Object {$_.Name -match $regex} `
                             | ForEach-Object { [int] $Matches[1] }

输入基本上是对象,其属性Name可以是格式“prefix [Integer]”。如果是这种情况,我想提取该整数并将其插入一个新序列。

这似乎有效,但感觉我正在利用Power Shell语言中的实现细节。

你会如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

问题是每个管道表达式都是一个闭包。

Where-Object只会发送与管道匹配的项目,而不是上下文。

最简单易懂的方法是:

Get-Collection | ForEach-Object { if($_.Name -match $regex) { [int] $Matches[1] } }

答案 1 :(得分:0)

你没有在这里利用任何东西,它对我来说看起来非常有用。

  1. 您获得了一组对象
  2. 使用Where-Object
  3. 过滤掉与正则表达式匹配的内容
  4. 您将过滤后的对象传递给ForEach-Object循环,该循环只是将管道中的正则表达式匹配表示为整数。
  5. 完全正常的代码。有什么问题?