4

特定のプロセスのワーキング セットを取得するために、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 "------------------------------"
}
4

2 に答える 2

1

これは.NET Framework のバグです。結果の下位 32 ビットのみを取得し、64 ビットの数値にキャストしています。

問題は、上位ビットが切り捨てられると、実際の値を決定するのに十分な情報がないことです。値が確実に入る可能性のある範囲はありますか? たとえば、2 GB から 6 GB になることがわかっている場合は、メソッドによって返される値を簡単にマップできます。

私が考えることができる唯一の一般的な解決策は、利用可能な他のプロパティを調べて、返される値の範囲を決定するのに十分なヒントを提供できるものがないかどうかを確認することです。

于 2012-07-10T17:53:12.767 に答える
1

WS の代わりに WorkingSet64 を使用する

例えば:

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

/アンドレ

于 2015-02-06T15:29:15.193 に答える