特定のプロセスのワーキング セットを取得するために、PowerShell で OS 呼び出しを行います。
ワーキング セットが 2GB 未満の場合、値は正しく返されます。
ワーキング セットが 2GB から 4GB の場合、値は負の数値として返されます。4294967295 で xor し、-1 を掛けて、正しい値を取得できます。
ワーキングセットが4GBを超えるまでは、すべてが順調でした。返された値は 4GB からカウントアップしているようです... IOW、結果を 4294967296 に追加する必要があります。
私のビット単位の操作チョップは少し錆びており、OS が返すものに基づいて正しい値を正確に計算する手段があるかどうかはわかりません。理想的には、仕事をする 1 つの式、または少なくとも一連の "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 "------------------------------"
}