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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:48:11