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

时间:2017-04-19 15:58:38

标签: powershell powershell-v5.0

假设我有一个文件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

看起来正是我要总结的东西。接下来我尝试应用Measure-Object:

$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

我做错了什么?

3 个答案:

答案 0 :(得分:3)

您的数组不是由数字组成,而是包含字符串值非常长的属性名称(您的scriptblock-value)的对象。

Select-Object替换为Foreach-Object以获取值,将其转换为int并进行计算。例如:

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

答案 1 :(得分:1)

  

看起来就像我想要求和

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

1
2
3

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

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

代替。

答案 2 :(得分:1)

其他方法:

$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