我有一个脚本可以解析最后15行的日志文件,但它会以水平线输出数据,当我尝试获取文件中数字的平均值时,我认为这会干扰。
以下是我正在解析的日志文件示例:
3/22/2016 9:11:21 AM 44.0 3/22/2016 9:11:22 AM 44.1 3/22/2016 9:11:23 AM 44.2 3/22/2016 9:11:24 AM 44.3
这是我的PowerShell命令,用于解析活动日志文件的最后15行。
$regexNUM = '\d+\.\d+'
$NUMLog = Get-ChildItem -Path 'C:\Users\Admin\Documents' |
Where-Object {$_.Name -match "LOGFILE"} |
Sort LastWriteTime | Select -Last 1
$NUMBERS = Get-Content -Path "C:\Users\Admin\Documents\$NumLog" -Tail 15 |
Select-String -Pattern $regexNum -AllMatches |
% { $_.Matches } | % { $_.Groups }
当我执行Write-Host $NUMBERS
时,它会输出如下数据:
39.5 39.6 39.7 39.8 39.9 40.0 40.1 40.2 40.3 40.4 40.5 40.6 40.7 40.8 40.9
以下是我试图获得这15个数字的平均值的方法:
$Average = $NUMBERS | Measure-Object -Average | Select Average
当我Write-Host $Average
时,它说:
Measure-Object : Input object "39.5" is not numeric. At C:\Users\Admin\Documents\SampleTest.ps1:26 char:30 + $Average = $NUMBERS | Measure-Object -Average | Select Average + ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidType: (39.5:Match) [Measure-Object], PSInvalidOperationException + FullyQualifiedErrorId : NonNumericInputObject,Microsoft.PowerShell.Commands.MeasureObjectCommand
我不确定为什么会说数字39.5不是数字,但我可以假设它不喜欢它与空格可能是水平的。它也会为15个数字中的每一个抛出其中一个错误。
答案 0 :(得分:2)
代码中的问题是您实际上将System.Text.RegularExpressions.Match
类型的对象提供给Measure-Object
cmdlet,而不是数字。
Write-Host
命令会在需要将Match
对象输出到控制台时自动将其转换为文本,这会让您认为它看起来像数字。
要解决此问题,请更改以下行以获取Match
个对象中的值:
$NUMBERS = Get-Content -Path "C:\Users\Admin\Documents\$NumLog" -Tail 15 |
Select-String -Pattern $regexNum -AllMatches |
% { $_.Matches } | % { $_.Value }
要自行修复此类问题,可以使用Get-Member
cmdlet检查返回的类型。
在您的情况下,您可以将第二个Get-Content
cmdlet的输出发送到Get-Member
,而不是将其保存到变量:
Get-Content -Path "C:\Users\Admin\Documents\$NumLog" -Tail 15 |
Select-String -Pattern $regexNum -AllMatches |
% { $_.Matches } | % { $_.Groups } | Get-Member