2012-04-18 3 views
2

私は改善したい基本スクリプトを持っていますので、現在実行している(カウンタを集中的に取得している)代わりにジョブとしてperfmonカウンタを収集します。ジョブを取得するカウンタは使用できないデータを返します

問題は、PowershellのジョブでGet-Counterを実行すると、戻ってくるデータを正しく検査/使用できないということです。私はそれがデータをシリアル化するからだと思います。 "Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSampleを" と言う文字列を返します

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:

これは、かなり基本的な私のスクリプトです。これがカウンタオブジェクトのデータ型です。

私は仕事のこの外側を実行した場合、それがうまく返します

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

私はきちんと仕事の結果内のデータを使用することができますどのように誰もが知っていますか?

私はこれについて何か考えている答えはまだありませんでしたか?

答えて

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) 
} 
0

私が見つけた唯一のことは、Readings

$JobResults.Readings 

拡張プロパティを使用することです。しかし、なぜあなたはWMIを使用していない:

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

応答をありがとう、それは値を返しますが、私はいくつかの他のプロパティでも動作する必要があります。つまり、$ Counter.CounterSamples [0] | Select * - これはpath、instancename、timestampなどの他のものを返します。また、私のクエリはこの単純な例よりも多くのカウンターを使用しますので、WMIは非常に迅速に複雑になると思います! – HungryHippos