我想将_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
答案 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