Get-Counter with Jobs返回不可用的数据

时间:2012-04-18 21:56:58

标签: powershell powershell-v2.0

我有一个基本的脚本,我想改进,所以它关闭并收集perfmon计数器作为工作而不是我目前正在做的事情(集中检索计数器)。

问题是,当我在Powershell的Job中运行Get-Counter时,无法正确检查/使用返回的数据。我认为这是因为它序列化了数据。

这是我的剧本,非常基本:

Start-Job -ScriptBlock {$Counter = Get-Counter "\LogicalDisk(C:)\% Free Space" -MaxSamples 1 -SampleInterval 1 ; return $Counter}

do
{
    [array]$JobCount = Get-Job -State "Completed"
    $JobResults = Get-Job | Receive-Job

    if ($JobCount.Count -gt 0)
    {
        Write-Host "Job Completed"
    }
    else
    {
        Write-Host "Sleeping 1 Second..."
        Start-Sleep 1
    }
}
while ($JobCount.Count -lt 0)

$JobResults.CounterSamples

$ JobResults.CounterSamples返回一个字符串,上面写着“Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample”。这是计数器对象的数据类型。

如果我在工作之外运行它,它就会恢复正常:

$Counter = Get-Counter "\LogicalDisk(C:)\% Free Space" -MaxSamples 1 -SampleInterval 1
$Counter.CounterSamples

任何人都知道如何正确使用作业结果中的数据?

仍然没有得到我正在寻找的答案,任何人的想法?

2 个答案:

答案 0 :(得分:1)

我自己找到了解决这个问题的方法,基本上是在处理作业中的Countersamples而不是试图将结果传回处理:

$ScriptBlock = {

    param
    (
        $Server,
        $ExportCSV
    )

    $Counter = Get-Counter -ComputerName $Server "LogicalDisk(C:)\% Free Space" -MaxSamples 10 -SampleInterval 2
    $CounterSamples = $Counter | % {$_.CounterSamples}

    $MasterArray = @()
    foreach ($CounterSample in $CounterSamples)
    {
        $TempArray = @()
        $TempArray = "" | Select Server, ObjectName, CounterName, InstanceName, Value, DateTime

        $Split = $CounterSample.Path.Remove(0,2)
        $Split = $Split.Split("\")

        $TempArray.Server = $Split[0]
        $TempArray.ObjectName = $Split[1].Split("(")[0]
        $TempArray.CounterName = $Split[2]
        $TempArray.InstanceName = $CounterSample.InstanceName
        $TempArray.Value = $CounterSample.CookedValue
        $TempArray.DateTime = $CounterSample.TimeStamp.ToString("yyyy-MM-dd HH:mm:ss")

        $MasterArray += $TempArray
    }

    $MasterArray | Export-Csv $ExportCSV -NoType
}

$Servers = "CHRIS-PC"

foreach ($Server in $Servers)
{
    $ExportCSVFile = "C:\Temp\$Server" + "_Samples.csv"
    Start-Job -ScriptBlock $ScriptBlock -ArgumentList @($Server, $ExportCSVFile)
}

答案 1 :(得分:0)

我发现的唯一一件事就是使用扩展属性Readings

$JobResults.Readings

但是你为什么不使用WMI:

[WMI]"root\cimv2:Win32_LogicalDisk.DeviceID='C:'"