powershell – 通过按位运算将大整数转换为有意义的值

我在Power
Shell中进行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 "------------------------------"
}

最佳答案 它是一个
bug in the .NET Framework.它只抓取结果的底部32位并将其转换为64位数.

问题是,一旦顶部位被截断,您没有足够的信息来确定实际值.你有任何价值可以确定的范围吗?例如,如果您知道它介于2 GB和6 GB之间,则可以轻松映射方法返回的值.

我能想到的唯一通用解决方案是查看其他可用属性,看看是否有任何属性可以给你足够的提示来确定返回值的范围.

点赞