2016-02-25 10 views
1

У меня есть следующий скрипт работает счетчик производительности внутри работы:Повторные результаты счетчиков производительности из в работе

$counter = { 
    param($TestLength) 
    $perfsample = Get-Counter -Counter ` 
    "\PhysicalDisk(_Total)\% Disk Time",` 
    "\Processor(_Total)\% Processor Time",` 
    "\Process(_Total)\Working Set",` 
    "\Network Interface(*)\Bytes Total/Sec"` 
    -SampleInterval 1 -MaxSamples $TestLength -ErrorAction SilentlyContinue 

    $perfsample 
} 

Start-Job -Name GettingCounters -ScriptBlock $counter -ArgumentList $TestLength | Wait-Job 

Export-Counter -Path $DestinationFile -FileFormat csv -InputObject (Receive-Job GettingCounters) 

При выполнении приведенного выше кода, я подарил со следующей ошибкой:

Export-Counter : Cannot bind parameter 'InputObject'. Cannot convert the "Micro 
soft.PowerShell.Commands.GetCounter.PerformanceCounterSampleSet" value of type 
"Deserialized.Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample 
Set" to type "Microsoft.PowerShell.Commands.GetCounter.PerformanceCounterSample 
Set". 

Я понимаю, что это связано с сериализацией вывода, так что можно было бы вернуть десериализованный выход?

ответ

1

К сожалению, все типы не являются сериализуемыми. Почему бы просто не экспортировать внутреннюю работу?

$counter = { 
    param($TestLength, $DestinationFile) 
    $perfsample = Get-Counter -Counter ` 
    "\PhysicalDisk(_Total)\% Disk Time",` 
    "\Processor(_Total)\% Processor Time",` 
    "\Process(_Total)\Working Set",` 
    "\Network Interface(*)\Bytes Total/Sec"` 
    -SampleInterval 1 -MaxSamples $TestLength -ErrorAction SilentlyContinue 

    $perfsample | Export-Counter -Path $DestinationFile -FileFormat csv 
} 

Start-Job -Name GettingCounters -ScriptBlock $counter -ArgumentList $TestLength, $DestinationFile | Wait-Job 

В качестве альтернативы можно использовать вместо пространств выполнения заданий, поскольку они не требуют сериализации объектов и, как правило, быстрее (по крайней мере, когда вы используете RunspacePool для запуска нескольких потоков в parrallel). Еще несколько линий для его использования:

$DestinationFile = ".\Desktop\test.csv" 
$TestLength = 10 

$counter = { 
    param($TestLength) 
    $perfsample = Get-Counter -Counter ` 
    "\PhysicalDisk(_Total)\% Disk Time",` 
    "\Processor(_Total)\% Processor Time",` 
    "\Process(_Total)\Working Set",` 
    "\Network Interface(*)\Bytes Total/Sec"` 
    -SampleInterval 1 -MaxSamples $TestLength -ErrorAction SilentlyContinue 

    $perfsample 
} 

$Powershell = [powershell]::Create() 
$Powershell.AddScript($counter) 
$Powershell.AddParameter("TestLength",$TestLength) 
$job = $Powershell.BeginInvoke() 

#Get results 
$result = $Powershell.EndInvoke($job) 
$result | Export-Counter -Path $DestinationFile -FileFormat csv 

#Cleanup 
$Powershell.Dispose() 
$Powershell = $null 
$job = $null 

 Смежные вопросы

  • Нет связанных вопросов^_^