如何在不使用 foreach 循环的情况下通过管道处理 "Select-String -pattern" return 对象?

How to address "Select-String -pattern" return object via pipeline without using foreach loop?

假设我有一个包含以下内容的文件:

1,first_string,somevalue
2,second_string,someothervalue
n,n_nd_string,somemorevalue

我需要获取此文件的内容,获取最后一个字符串并获取“,”符号前的数字(在本例中为 n)。 (我只会递增它并将 n+1 个字符串附加到这个文件,但现在这并不重要)。我希望所有这些东西都用 pipeline cascade

完成

到目前为止我已经找到了这个解决方案:

[int]$number = Get-Content ..mpcpl | Select-Object -Last 1 | Select-String -Pattern '^(\d)' | ForEach-Object {$_.matches.value}

它确实有效,但我想知道是否有任何方法可以寻址 Select-String -Pattern '^(\d)' return不使用 foreach 循环的对象?因为我知道 return 集合在我的例子中只包含一个 1 元素(我选择了一个文件的最后一个字符串,我只得到一个匹配项)

您可以使用

$num = [int]((Get-Content ..mpcpl | Select-Object -Last 1) -replace '^(\d).*', '')

备注

  • (Get-Content ..mpcpl | Select-Object -Last 1) - 读取文件并获取最后一行
  • (... -replace '^(\d).*', '') - 从返回的行中获取第一个数字(注意:如果行不是以数字开头,它将失败,因为输出将是整行)
  • [int] 将字符串值转换为 int.

另一种方法是获取匹配项,然后从默认 $matches 变量中检索它:

[IO.File]::ReadAllText($filepath) -match '(?m)^(\d).*\z' | Out-Null
[int]$matches[1]

(?m)^(\d).*\z 模式将最后一行开头的数字放入第 1 组,因此 $matches[1]

我觉得它像一个 csv...

import-csv 1.mpcpl -header field1,field2,field3 | select -last 1 | select -expand field1

输出:

n