如何在 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
我正在尝试获取每个用户(如任务管理器)进程的内存使用情况,如果我们将该值转换为 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