Го-Цзюн Цзэн, добро пожаловать в SO.
Прежде всего, причина в том, что в разделе «Сеть» ничего не отображается, в том, что расширение переменной не удается. Позвольте мне объяснить - хотя PowerShell понимает базовые c переменные для раскрытия внутри строк в двойных кавычках, он напрямую не понимает немного более сложные объекты, которые имеют свои собственные свойства. Итак, проблема, с которой вы столкнулись, заключается в следующем:
@{"Name"="Network"; Expression = {get-counter "\Process($_.Name)\IO Read Bytes/sec"}}
Поскольку '$ _. Name' находится в двойных кавычках, PowerShell не знает, что с ним делать. Есть несколько способов, которыми вы можете легко приспособиться к этому:
@{"Name"="Network"; Expression = {get-counter "\Process($($_.Name))\IO Read Bytes/sec"}}
или использование строковых токенов:
@{"Name"="Network"; Expression = {get-counter ("\Process({0})\IO Read Bytes/sec" -f $_.Name)}}
Однако в моих тестах для воспроизведения простой запуск Get-Counter возвращает a сложный объект. То есть объект, который имеет свои собственные свойства и методы, так что это все равно не должно работать. При назначении результирующего свойства я подумал, что вы будете после (Get-Counter "\ Process (ProcessName) \ IO Read Bytes / se c"). CounterSamples.CookedValue, скрипт никогда не возвращал данные вообще - как Get -Счетчики занимали слишком много времени или что-то в этом роде.
Однако «Win32_PerfFormattedData_PerfProc_Process», по-видимому, уже имеет эквивалентное свойство для счетчика, для которого, по-видимому, нужны данные: IOReadBytesPerse c.
Единственное единственное Я хотел бы отметить, что как это свойство, так и счетчик производительности c, определяемый Process для 'IO Read Bytes / se c', учитывают ВСЕ ввод-вывод, а не только сеть. Фактически, глядя на объект процессора, я не смог найти счетчики, которые были указаны c только для сети.
Ваш CPU ничего не показывает, когда я запускаю его, потому что вы пытаетесь разделить на 0 во многих случаях. Глядя на PercentProcessorTime, он ничего не указывает об общем количестве всех процессоров. Я бы не предполагал, что нагрузка распределяется между ядрами, как это делает ваш код - я могу ошибаться. некоторые из вещей, которые вы делаете:
- Явно запрашивает нужные свойства у 'Win32_PerfFormattedData_PerfProc_Process', поэтому он не по умолчанию для всех свойств.
- Консолидация Select-Object -First 5 с вашим первым Select-Object, так что вы работаете только с этими 5 в остальной части l oop.
Вот немного измененный код, чтобы показать некоторые изменения, которые я описал:
$RAM= Get-WMIObject Win32_PhysicalMemory | Measure -Property capacity -Sum | %{$_.sum/1Mb}
$cores = (Get-WmiObject Win32_Processor).NumberOfLogicalProcessors
while ($true) {
$tmp = Get-WmiObject Win32_PerfFormattedData_PerfProc_Process |
select-object -First 5 -Property Name, @{Name = "CPU"; Expression = {($_.PercentProcessorTime)}}, @{Name = "PID"; Expression = {$_.IDProcess}}, @{"Name" = "Memory(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}}, @{"Name" = "Memory(%)"; Expression = {([math]::Round(($_.WorkingSetPrivate/1Mb)/$RAM*100,2))}}, @{Name="Disk(MB)"; Expression = {[Math]::Round(($_.IODataOperationsPersec / 1mb),2)}}, @{"Name"="Network"; Expression = { $_.IOReadBytesPersec }} |
Where-Object {$_.Name -notmatch "^(idle|_total|system)$"} |
Sort-Object -Property CPU -Descending
cls
$tmp | Format-Table -Autosize -Property Name, CPU, PID, "Memory(MB)", "Memory(%)", "Disk(MB)", "Network";
Start-Sleep 3
}