PowerShell中磁盘Size属性数学运算返回0的问题排查
解决PowerShell中Win32_DiskDrive的GB列显示0的问题
嘿,我来帮你排查这个问题!你遇到的GB列全是0的情况,核心原因是类型转换不匹配,咱们一步步拆解:
首先,Win32_DiskDrive的Size属性是无符号64位整数(UInt64),而PowerShell里默认的1GB是有符号32位整数(Int32)。当你直接用UInt64除以Int32时,跨类型运算很容易出问题——要么是触发数值溢出,要么是隐式转换时把值截断成0。另外,如果你的系统里Size属性意外返回了字符串(比如旧系统或特殊配置),直接除法会把字符串隐式转成0,结果自然也是0。
修正方案
方案一:用计算属性替代Add-Member(更简洁可靠)
直接在Select-Object里定义计算属性,显式处理类型转换:
Get-WMIObject win32_diskdrive -computer $poste | Select-Object model, size, @{Name='GB'; Expression={ # 先判断Size是否存在,再转成UInt64计算 if ($_.Size) { [int]([UInt64]$_.Size / [UInt64]1GB) } else { 0 } }}
方案二:修正Add-Member的ScriptProperty
如果你坚持用Add-Member的方式,修改ScriptProperty的逻辑,确保类型一致:
Get-WMIObject win32_diskdrive -computer $poste | Add-Member -MemberType ScriptProperty -Name GB -Value { if ($_.Size) { [int]([UInt64]$_.Size / [UInt64]1GB) } else { 0 } } -PassThru | Select-Object model, size, GB
关键细节解释
- 显式把
$_.Size转成[UInt64]:确保我们处理的是数值类型,避免字符串转换导致的0值。 - 把
1GB转成[UInt64]:让运算在同类型下进行,避免跨类型运算的溢出或截断。 if ($_.Size)判断:处理那些Size为空的特殊磁盘(比如未初始化的虚拟磁盘),防止出现除以0的错误。
内容的提问来源于stack exchange,提问作者Rakha
相关产品推荐
相关产品推荐

