我有一个基本的脚本,我想改进,所以它关闭并收集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
任何人都知道如何正确使用作业结果中的数据?
仍然没有得到我正在寻找的答案,任何人的想法?
答案 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:'"