Я пытаюсь получить использование памяти процессом для каждого пользователя (например, диспетчер задач), эта информация поступает в память (частный рабочий набор), если мы преобразуем эти значения в МБ, мы должны получить использование памяти, как в представлении пользователей в задаче управляющий делами...
Может быть, я что-то упустил, если кто-то знает об этом, пожалуйста, сообщите мне.
А это мой сценарий
Get-WmiObject Win32_Process | Sort-Object -Property privatememorysize -Descending |
Select processname, @{Name = "Mem Usage(MB)";Expression = {[math]::round($_.privatememorysize/ 1mb,2)}},@{Name = "UserID";Expression = {$_.getowner().Domain+"\"+$_.getowner().user}} | fl *
Проблема в том, что у класса Win32_Process
нет свойства с именем «privatememorysize». Вместо этого, заменив его на «privatepagecount», все будет работать так, как ожидалось.
Get-WmiObject Win32_Process | Sort-Object -Property privatepagecount -Descending |
Select processname, @{Name = "Mem Usage(MB)";Expression = {[math]::round($_.privatepagecount/ 1mb,2)}},@{Name = "UserID";Expression = {$_.getowner().Domain+"\"+$_.getowner().user}}
Я вижу, это не одно и то же, поэтому у нас есть проблема, когда объект WMI не предоставляет частный рабочий набор, а другие методы, которые включают, не имеют пользователя. Итак, что мы можем сделать, так это использовать Get-Process
, чтобы получить каждый процесс и частный рабочий набор, и использовать Get-WMIObject
, чтобы связать пользователя с каждым объектом, а затем сопоставить их. Вероятно, лучше всего создать хеш-таблицу из одной ссылки, а затем использовать ее для добавления свойства к другому объекту. Итак, давайте сделаем это!
#Get WMI Process objects
$WMIProcs = Get-WmiObject Win32_Process
#Get Get-Process object
$GPProcs = Get-Process
#Convert Get-Process objects to a hashtable for easy lookup
$GPHT = @{}
$GPProcs | ForEach-Object {$GPHT.Add($_.ID.ToString(),$_)}
#Add PrivateWorkingSet and UserID to WMI objects
$WMIProcs|ForEach-Object{
$_ | Add-Member "Mem Usage(MB)" $([math]::round($GPHT[$_.ProcessId.ToString()].PrivateMemorySize64/1mb,2))
$_ | Add-Member "UserID" $($_.getowner().Domain+"\"+$_.getowner().user)
}
#Output to screen
$WMIProcs | Format-Table ProcessName, "Mem Usage(MB)", UserID
который должен был закрыться, результат был.. Процесс блокнота в сценарии = 28144 КБ ..... Процесс блокнота в диспетчере задач (подробное представление, столбец: частный рабочий набор) = 22016 КБ, результат, который мне нужно получить, это значение в представление пользователей
нет способа получить значение этого столбца?
Хорошо, получить значение из этого столбца возможно, но не тривиально. Я обновил свой ответ, чтобы получить нужные вам данные.
Попробуйте использовать WorkingSetSize
вместо PrivateMemorySize
.
Get-WmiObject Win32_Process | Sort-Object -Property WorkingSetSize -Descending |
Select processname, @{Name = "Mem Usage(MB)";Expression = {[math]::round($_.WorkingSetSize / 1mb,2)}},@{Name = "UserID";Expression = {$_.getowner().Domain+"\"+$_.getowner().user}} | FL
Мне нужны значения в частном рабочем наборе памяти столбца, это значение, которое мы видим в представлении пользователей в диспетчере задач, если я использую Worksetsize, значения, которые у меня есть, не совпадают
Я не вижу никакого значения, которое соответствует Память (частный рабочий набор) в диспетчере задач, отображаемому как свойство Get-WmiObject Win32_Process
или Get-Process
. Однако Память - рабочий набор можно добавить в качестве столбца в диспетчер задач (Просмотр -> Выбрать столбцы), и он точно совпадает. Будет ли это работать для ваших нужд?
Вот Статья суперпользователя о несоответствии с хорошей связанной информацией.
я знаю, что рабочий набор дает мне точное значение, которое я получаю, что это не значение в диспетчере задач (просмотр пользователей) ... например, процесс Notepad ++ в сценарии = 28144 КБ, это если я использую WS ... .. Процесс Notepad ++ в диспетчере задач (детальный вид, столбец: частный рабочий набор) = 22016 КБ -> Если я конвертирую это в МБ (на 20 МБ больше или меньше), и эти 20 МБ - это то, что мне нужно, но я не знаю, как получить это
PrivatePageCount
— это количество страниц памяти. Округление для получения МБ, вероятно, будет неточным.