将特定的Powershell Get-Counter统计信息放入变量中

时间:2014-12-29 15:36:23

标签: powershell monitoring

我想将_Total(CounterSamples)中的特定统计信息提取到变量中,以便进一步解析它。

这是我尝试过的。 尝试使用[1]进行索引会在下面进一步给出错误。 循环似乎也没有让我走得很远。

cls
$statToCollect = '\Process(_Total)\IO Data Operations/sec'
Get-Counter $statToCollect
Write-Host "================" 
$saveStats = Get-Counter $statToCollect
$ctrSamples = $saveStats[1].CounterSamples
Write-Host "$ctrSamples"
Write-Host "$($saveStats)"
Write-Host "================"

$diskStats = Get-Counter $statToCollect 
$diskStatsLoopCounter = 1 
foreach ($diskStat in $diskStats)
{
    if ($diskStatsLoopCounter -eq 1) 
    {
        write-host "$($diskStat.CounterSamples)" 
    }
    $diskStatsLoopCounter = $diskStatsLoopCounter + 1 
}

结果:

Timestamp                 CounterSamples                                                     
---------                 --------------                                                     
12/29/2014 9:27:49 AM     \\mpcname\process(_total)\io data operations/sec :                
                          970.6265098029                                                     


================
Unable to index into an object of type Microsoft.PowerShell.Commands.GetCounter.PerformanceCo
unterSampleSet.
At C:\Users\neal.walters\Documents\DiskUtil.ps1:6 char:26
+ $ctrSamples = $saveStats[ <<<< 1].CounterSamples
    + CategoryInfo          : InvalidOperation: (1:Int32) [], RuntimeException
    + FullyQualifiedErrorId : CannotIndex


Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet
================
Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample

2 个答案:

答案 0 :(得分:2)

在您的特定情况下,$saveStats只是一个元素。

PS C:\Users\mcameron> $saveStats.Count
1

这就是为什么这个命令会返回null输出,因为没有第二个。

PS C:\Users\mcameron> $saveStats[1]

由于只有一个元素,以下任何一个选项都适用于这种情况。

PS C:\Users\mcameron> $saveStats[0]

PS C:\Users\mcameron> $saveStats

同样对于行Write-Host "$($saveStats)",因为$saveStats是一个对象而不是一个字符串,它不会像你期望的那样扩展。很确定会发生这种情况,因为ToString()没有重载来处理这个问题所以只输出了对象类型。只需拥有$saveStats就可以让PowerShell使用自己的内置cmdlet正确格式化它。

PS C:\Users\mcameron> $saveStats

Timestamp                 CounterSamples                                                                                      
---------                 --------------                                                                                      
12/29/2014 10:56:53 AM    \\c3935\process(_total)\io data operations/sec :                                                    
                          27.7291444862573

write-host "$($diskStat.CounterSamples)"行类似的问题,其响应与上述相同。

正如其他评论者和海报所说,你很可能想要一个像CookedValue这样的属性,可以很容易地转换为字符串。

write-host "$($diskStat.CounterSamples.CookedValue)"

答案 1 :(得分:1)

在Windows 8.1上使用PowerShell版本4:

Get-Counter返回PerformanceCounterSampleSet,您可以访问CounterSamples属性以获取PerformanceCounterSample个对象的数组。

您感兴趣的特定属性是CookedValue

$statToCollect = '\Process(_Total)\IO Data Operations/sec'
$total = (Get-Counter $statToCollect).CounterSamples.CookedValue

这会让你得到一个双倍的结果:

PS> $total
28.9450419770711

PS> $total.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Double                                   System.ValueType