如何对 Select-String 提取的数字求和?

How can I sum numbers extracted by Select-String?

假设我有一个文件 numbers.txt:

My number 1
...
My number 2
...
My number 3
...

我正在尝试计算以上数字的总和。我从每一行中提取了一个数字,如下所示:

PS > $numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" |
>> select {$_.matches[0].groups[1].Value}
>>
PS > $numbers

$_.matches[0].groups[1].Value
-----------------------------
1
2
3

看起来正是我想要总结的。接下来我尝试应用测量对象:

$numbers | measure -sum
measure : Input object "" is not numeric.
At line:1 char:12
+ $numbers | measure -sum
+            ~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:PSCustomObject) [Measure-Object], 
PSInvalidOperationException
    + FullyQualifiedErrorId : 
NonNumericInputObject,Microsoft.PowerShell.Commands.MeasureObjectCommand

我做错了什么?

你的数组不是由数字组成,而是包含一个很长的 属性 名称(你的脚本块值)的对象,其中包含一个字符串值。

替换Select-Object with Foreach-Object得到值,转换为int并计算。例如:

$numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" | Foreach-Object {$_.matches[0].groups[1].Value -as [int] }
($numbers | measure -sum).Sum

Looks like exactly what I want to sum

不,它没有,输出有 header 行。如果它是一个简单的整数数组,那么它就不会,它会简单地显示为:

1
2
3

您创建的是一组 PowerShell objects,每个数组都有一个名为 '$_.matches[0].groups[1].Value' 的 属性。你需要这样的东西:

$numbers = gc .\numbers.txt | sls -Pattern "number\ (\d+)" | ForEach {$_.matches[0].groups[1].Value}

相反。

其他方法:

$template=@"
My number {number*:1}
My number {number*:2}
"@


#verbose version
(Get-Content C:\temp\number.txt | 
    ConvertFrom-String -TemplateContent $template | 
        measure -Sum number).Sum

#short version
(gc C:\temp\number.txt | cfs -TemplateContent $template | Measure -Sum number).Sum