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

时间:2019-05-28 16:01:18

标签: powershell windows-server-2012-r2

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

2 个答案:

答案 0 :(得分:1)

问题是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

答案 1 :(得分:0)

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