CMD运行WMIC与VBScript查询AdapterRAM返回值不一致原因
问题原因
不存在配置遗漏,两个环境返回结果不一致是底层机制差异导致的:
Win32_VideoController的AdapterRAM属性本身是*无符号64位整数(uint64)*类型,VBScript的Variant原生类型不支持直接解析uint64值。当显存大小超过32位有符号整数上限(2147483647,即2GB)时,直接读取属性会出现数值截断、符号位识别错误,最终输出异常负数。而WMIC工具内部专门做了uint64类型的转换适配,所以可以正常返回大数值。- 如果你用32位脚本宿主(
C:\Windows\SysWOW64路径下的wscript.exe/cscript.exe)运行脚本,WMI的32位兼容层本身对4GB以上显存的读取存在已知截断bug,会进一步导致返回值错乱,你拿到的-1048576就是数值高位被截断、符号位误判后的典型错误结果。
修复方案
- 优先用64位脚本宿主运行:调用
C:\Windows\System32路径下的cscript.exe或wscript.exe执行脚本,64位环境对大整数的兼容性更好,多数场景下可直接返回正确值。 - 手动解析原始属性值:如果需要兼容32位环境,不要直接读取
oPC.AdapterRAM,通过WMI属性接口拿到原始字节数组,按小端序手动计算真实显存值,可完全规避类型兼容问题,参考代码如下:
sPC = "." Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sPC & "\root\cimv2") Set cSettings = objWMIService.ExecQuery("Select AdapterRAM From Win32_VideoController Where DeviceID='VideoController1'") For Each oPC in cSettings ' 获取uint64类型的原始字节数据 ramBytes = oPC.Properties_("AdapterRAM").Value ' 按小端序累加计算64位无符号数值,用CDbl避免溢出 GPURAMSize = CDbl(ramBytes(0)) + CDbl(ramBytes(1))*256 + CDbl(ramBytes(2))*65536 + CDbl(ramBytes(3))*16777216 _ + CDbl(ramBytes(4))*4294967296 + CDbl(ramBytes(5))*1099511627776# + CDbl(ramBytes(6))*281474976710656# + CDbl(ramBytes(7))*72057594037927936# WScript.Echo GPURAMSize Next
运行后就能得到和WMIC一致的8589934592结果。
内容的提问来源于stack exchange,提问作者user3208239
相关产品推荐
相关产品推荐

