PowerShell для возврата значений, как менеджер задач - PullRequest
0 голосов
/ 17 марта 2020

Я хочу использовать PowerShell для возврата значений, нравится менеджер задач. Тем не менее, элемент использования сети не может вернуться правильно. Как я могу изменить код? Большое спасибо.

$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 -property Name, @{Name = "CPU"; Expression = {($_.PercentProcessorTime/$cores)}}, @{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 = {get-counter "\Process($_.Name)\IO Read Bytes/sec"}} |
    Where-Object {$_.Name -notmatch "^(idle|_total|system)$"} |
    Sort-Object -Property CPU -Descending|
    Select-Object -First 5;
    cls
    $tmp | Format-Table -Autosize -Property Name, CPU, PID, "Memory(MB)", "Memory(%)", "Disk(MB)", "Network";
    Start-Sleep 3
}

Этот код изменен из статей следующим образом: 1. Использование ЦП и памяти в процентах для всех процессов в Powershell 2. https://superuser.com/questions/1314534/windows-powershell-displaying-cpu-percentage-and-memory-usage#new -ответ? Newreg = a9290345d72946db9c7f8fd2af10de0a 3. Сценарий Powershell - список процессов с использованием процессора, памяти, использования диска


Я добавляю переменную $ process, чтобы показать владельца каждого процесса, но отсутствуют некоторые параметры. Я не могу найти документы о Get-WmiObject Win32_PerfFormattedData_PerfProc_Process от Microsoft, это нормально? Модифицированный код выглядит следующим образом:

$RAM= Get-WMIObject Win32_PhysicalMemory | Measure -Property capacity -Sum | %{$_.sum/1Mb}
$cores = (Get-WmiObject Win32_Processor).NumberOfLogicalProcessors
$Process = Get-Wmiobject Win32_process -computername "myComputerName" | select *,@{Name='Owner';Expression={($_.GetOwner()).User}}
while ($true) {
    $tmp = Get-WmiObject Win32_PerfFormattedData_PerfProc_Process | 
    select-object -property Name, @{Name = "CPU"; Expression = {($_.PercentProcessorTime/$cores)}}, @{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 }}, @{Name="Username"; Expression = {($($Process | ?{$_.ProcessId -eq $Item.IDProcess})).Owner} |
    Where-Object {$_.Name -notmatch "^(idle|_total|system)$"} |
    Sort-Object -Property CPU -Descending|
    Select-Object -First 15;
    cls
    $tmp | Format-Table -Autosize -Property Name, CPU, PID, "Memory(MB)", "Memory(%)", "Disk(MB)", "Network", "Username";
    Start-Sleep 1
}

На модифицированную деталь ссылаются с https://powershell.org/forums/topic/getting-percentage-cpu-time-and-owner-for-processes/

1 Ответ

1 голос
/ 17 марта 2020

Го-Цзюн Цзэн, добро пожаловать в 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, он ничего не указывает об общем количестве всех процессоров. Я бы не предполагал, что нагрузка распределяется между ядрами, как это делает ваш код - я могу ошибаться. некоторые из вещей, которые вы делаете:

  1. Явно запрашивает нужные свойства у 'Win32_PerfFormattedData_PerfProc_Process', поэтому он не по умолчанию для всех свойств.
  2. Консолидация 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...