假设我有一个文件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
我做错了什么?
答案 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