将WmiMonitorID.UserFriendlyName的ASCII字符串转为整数写入注册表
解决显示器型号字符串转整数写入注册表的问题
问题核心
你从EDID获取的显示器型号$Model是ASCII字符串,但注册表要求使用整数格式写入,直接转字符串无效,需要将其转换为符合要求的整数类型。
关键分析
显示器型号本身是人类可读的字符串,没有天然对应的有意义整数。注册表要求的“整数格式”,更可能是指EDID中自带的产品代码标识(而非型号名称),也就是你原代码里已经处理的$ProductID——这个值本身就是整数,是显示器厂商定义的官方数字标识,完全符合注册表的整数要求。
如果确实需要将型号字符串编码为整数(比如业务需求强制),可以通过将字符串的ASCII字节转换为整数实现,具体修改如下:
代码修改方案
方案1:推荐使用EDID原生产品整数标识(更合理)
直接用你原代码中已经生成的$ProductID作为注册表写入的整数项,替换原$Model的使用场景即可,因为这是EDID规范里的标准整数标识,无需额外转换。
方案2:将型号字符串编码为整数(仅当业务强制要求时使用)
如果必须把型号字符串转成整数,可将字符串的ASCII字节转换为32位整数:
foreach ($Monitor in @(Get-WmiObject -Namespace root\wmi -Class WmiMonitorID)) { $bigEndianInt32 = [Convert]::ToInt32(-join $Monitor.ManufacturerName[0..2].ForEach({[Convert]::ToString($_ - 64,2).PadLeft(5,'0')}),2) $Manufacturer = (Convert-BigEndianToLittleEndian $bigEndianInt32) -shr 16 $ProductID = [int]::Parse(-join $Monitor.ProductCodeID[0..3].ForEach{[char]$_}, [System.Globalization.NumberStyles]::HexNumber) # 修改型号字符串转整数的逻辑 $ModelStr = ([System.Text.Encoding]::ASCII.GetString($Monitor.UserFriendlyName[0..($Monitor.UserFriendlyNameLength -3)]) -split ' ')[0] # 将字符串转为ASCII字节数组 $modelBytes = [System.Text.Encoding]::ASCII.GetBytes($ModelStr) # 转换为32位整数(不足4字节补0,小端序) if ($modelBytes.Length -lt 4) { $modelBytes = $modelBytes + [byte[]]::CreateInstance([byte], 4 - $modelBytes.Length) } $Model = [System.BitConverter]::ToInt32($modelBytes[0..3], 0) # ...后续写入注册表逻辑 }
额外排查提示
之前出现“找不到注册表项”的错误,除了变量类型问题,还要确认:
- 注册表路径拼接时,整数变量的格式是否正确(比如是否需要转十六进制字符串)
- 写入注册表的权限是否足够(需管理员权限运行脚本)
内容的提问来源于stack exchange,提问作者shoober420
相关产品推荐
相关产品推荐

