2

私は改善したい基本的なスクリプトを持っているので、現在行っていること (カウンターを一元的に取得すること) ではなく、オフになり、perfmon カウンターをジョブとして収集します。

問題は、Powershell のジョブで 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

ジョブ結果内のデータを適切に使用する方法を知っている人はいますか?

これについて私が探している答えがまだありませんでした。何かアイデアはありますか?

4

2 に答える 2

1

私はこれを回避する方法を自分で見つけました。基本的には、処理のために結果を返そうとするのではなく、ジョブ自体でカウンターサンプルを処理することでした。

$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)
}
于 2012-04-22T09:40:37.507 に答える
0

私が見つけた唯一のことは、拡張プロパティを使用することですReadings

$JobResults.Readings

しかし、WMI を使用しないのはなぜですか。

[WMI]"root\cimv2:Win32_LogicalDisk.DeviceID='C:'"
于 2012-04-19T06:05:48.757 に答える