我很好奇这是怎么发生的? 我的命令只是
get-process
进程正在运行并且确实消耗了一些内存,但为什么WS(K)和VM(M)有负值? (顺便说一句。我不确切知道WS和VM代表什么) 我正在使用PowerShell 3.0
因为我运行了一个powershell脚本来检查值并报告我,如果值低于0,我现在收到一封邮件,因为它低于0:)
我怎样才能将其转化为价值,无论是负面还是正面?
答案 0 :(得分:4)
这个here的一些背景知识,但实际上这是PowerShell(或更深层次的)在32位/ 64位和有符号/无符号数字之间混淆。
如果我在64位服务器上运行get-process DBPROCESS
有一些重要的数据库进程,我可以看到一些负数,例如。
. Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
. ------- ------ ----- ----- ----- ------ -- -----------
. 19357 348 -297416 -581352 34 5,407.32 6012 DBPROCESS
我将查看WS(K) - WorkingSet编号。
重新运行以下命令表明还有其他64位属性表示相同的参数:
get-process DBPROCESS | select-object -property working* | fl
WorkingSet : -595304448
WorkingSet64 : 3699662848
WorkingSet的值对应于WS(K)列乘以1024
即。 -581385 x 1024 = -595304448
我们可以看到,WorkingSet64是一个更大的数字 - 远远大于32位有符号整数可以表示的最大+ ve数(2,147,483,647)。
3699662848(根据Windows计算器)的二进制表示是(11011100 10000100 01100000 00000000) - 只有32位,但至关重要的是,最重要(最左边)位是1。
当数字以二进制表示时,最高有效位表示符号。最高有效位(MSB)为0表示它是正数。相反,MSB为1表示它是负数。
在此示例中,PowerShell(或Windows)获取这些位并将它们解释为32位有符号整数(根据Windows计算器再次)为-595304448。
有趣的是,如果我从远程计算机(Windows 7 - 64位)运行get-process
,则两个数字都显示为负数。这是我怀疑的另一个问题......
WorkingSet : -595304448
WorkingSet64 : -595304448