4

我在 PowerShell 中进行操作系统调用以获取特定进程的工作集。

当工作集<2GB 时,正确返回值。

当工作集在 2GB 和 4GB 之间时,该值作为负数返回。我可以用 4294967295 异或,乘以 -1,得到正确的值。

世界上一切都很好……直到工作集超过 4GB。现在返回的值似乎从 4GB 开始计数... IOW,我需要将结果添加到 4294967296。

我的按位运算有点生疏,我不确定是否有办法根据操作系统返回的内容准确计算正确的值。理想情况下,我希望有一个可以完成这项工作的表达式,或者至少是一系列“if”语句。

这是 PS 代码,以防它澄清情况。它仅准确计算值 < 4GB 的工作集。

$ServerName = "MyServer"

# get a collection containing all process objects on the system
$Procs = (Get-Process -ComputerName $ServerName) | Sort-Object -Descending WS

# Output each process and its working set
foreach($Proc in $Procs)
{
     $WorkingSet = [int64]($Proc.WorkingSet64)

     #for values greater than 2^32, a negative value will be returned... need to convert to 64 bit:
     if($WorkingSet -lt 0) {
        $WorkingSet = 4294967295 -bxor $WorkingSet * -1
     }

     $Process = $Proc.ProcessName

     Write-Host "Process:     $process"
     Write-Host "Working Set: $WorkingSet"
     Write-Host "------------------------------"
}
4

2 回答 2

1

这是.NET Framework 中的一个错误。它只抓取结果的底部 32 位并将其转换为 64 位数字。

问题是一旦高位被截断,您就没有足够的信息来确定实际值。您是否有任何可以确定该值的范围?例如,如果您知道它将在 2 GB 和 6 GB 之间,则映射该方法返回的值会很容易。

我能想到的唯一通用解决方案是查看其他可用属性,看看它们中的任何一个是否可以为您提供足够的提示来确定返回值的范围。

于 2012-07-10T17:53:12.767 回答
1

使用 WorkingSet64 代替 WS

例如:

Get-Process -Name notepad | Select-Object -ExpandProperty WorkingSet64

/安德烈

于 2015-02-06T15:29:15.193 回答