You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:24:29