我在PowerShell中进行OS调用以获取特定进程的工作集。
当工作集是< 2GB,正确返回值。
当工作集介于2GB和4GB之间时,该值将返回为负数。我可以用4294967295 xor它,乘以-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 "------------------------------"
}
答案 0 :(得分:1)
这是bug in the .NET Framework。它只抓取结果的底部32位并将其转换为64位数字。
问题是,一旦顶部位被截断,您没有足够的信息来确定实际值。你有任何价值可以确定的范围吗?例如,如果您知道它介于2 GB和6 GB之间,则可以很容易地映射该方法返回的值。
我能想到的唯一通用解决方案是查看其他可用属性,看看是否有任何属性可以给你足够的提示来确定返回值的范围。
答案 1 :(得分:1)
使用WorkingSet64而不是WS
例如:
Get-Process -Name notepad | Select-Object -ExpandProperty WorkingSet64
/安德烈