如何在 powershell 中获取每个用户的内存(私有工作集)

How to get Memory (Private working set) per users in powershell

我正在尝试获取每个用户(如任务管理器)进程的内存使用情况,如果我们将该值转换为 MB,则该信息将进入内存(专用工作集),我们应该获得内存使用情况,例如用户在任务管理器中查看...

也许我遗漏了什么,如果有人知道请告诉我。

这是我的脚本

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 class 没有名为 '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

尝试使用 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