【问题标题】:How to get Memory (Private working set) per users in powershell如何在powershell中为每个用户获取内存(私有工作集)
【发布时间】:2019-05-28 16:01:18
【问题描述】:

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

【问题讨论】:

    标签: powershell windows-server-2012-r2


    【解决方案1】:

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

    【讨论】:

    • 我需要列内存私有工作集中的值,这是我们在任务管理器的用户视图中看到的值,如果我使用 Workingsetsize 我得到的值没有匹配
    • 我没有看到任何与任务管理器中的 Memory(Private Working Set) 匹配的值作为Get-WmiObject Win32_ProcessGet-Process 的属性公开。但是 Memory - Working Set 可以作为列添加到任务管理器(查看 -> 选择列)并且它完全匹配。这能满足您的需求吗?
    • 这里是SuperUser article 与一些好的链接信息的差异。
    • 我知道工作集给了我我得到的确切值,它不是任务管理器(用户视图)中的值......例如脚本中的记事本 ++ 进程 = 28144KB,这个是如果我在任务管理器中使用 WS ..... Notepad ++ 进程(详细视图,列:私有工作集)= 22016KB -> 如果我将其转换为 MB(多或少 20MB)并且我需要 20MB ,但我不知道如何得到它
    • This article 提到任务管理器“实际上并未为您尝试执行的工作任务提供真实信息。任务管理器向您展示的不仅仅是一个值。它在引擎盖下做了一些添加,并向您展示了一个复合材料。如果你介意靠近任务管理器私有内存,可以试试@TheMadTechnician 的技巧,或者this perf counter technique
    【解决方案2】:

    问题在于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
    

    【讨论】:

    • PrivatePageCountnumber of memory pages。四舍五入得到 MB 可能不准确。
    • 那是关闭,结果是..脚本中的记事本进程= 28144KB.....任务管理器中的记事本进程(详细视图,列:私有工作集)= 22016KB,结果我需要得到的是用户视图中的值
    • 没有办法获取该列的值吗?
    • 好的,从该列获取值是可能的,但这并不简单。我更新了我的答案,让你得到你想要的数据。
    猜你喜欢
    • 2023-04-09
    • 2011-04-15
    • 1970-01-01
    • 2011-02-06
    • 2014-09-13
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多