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