2

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

问题是,当我在 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

我自己找到了一种解决方法,基本上是在作业本身中处理 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)
}
于 2012-04-22T09:40:37.507 回答
0

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

$JobResults.Readings

但是你为什么不使用 WMI :

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