如何在Powershell中将十六进制值转换为版本号

时间:2019-04-01 23:01:51

标签: .net powershell

我正在尝试从Windows注册表中获取软件的版本号。理想情况下,我希望看到版本为2.0.3的版本,但是我得到的版本号为十进制格式33554435。

我尝试将十进制数转换为十六进制数(看起来非常接近版本号2.0.3),但我不知道如何将十六进制数转换为所需的版本号。我读了System.VersionConvert decimal to hex and binary,但现在被困住了。我能想到的就是提取数字2、0和3,以便可以将它们放入字符串中,但这并不理想,因为如果将软件更新为较新的版本,它将无法正常工作。任何帮助表示赞赏!

PS> "{0:x8}" -f 33554435
02000003
PS> $CGVer = "{0:x8}" -f 33554435
PS> $CGVer = "0x" + $CGVer
PS> $CGVer
0x02000003

2 个答案:

答案 0 :(得分:3)

我不喜欢@KoryGill的重复,否则重复answer(+ 1)。

  • 用于3..0的for循环计算应该对掩码也进行乘以8的移位
  • 将8位值存储在数组中
  • 直接使用-format运算符输出整个数组
  • 创建一个结合了最后16位的变体
  • 返回[PsCustomObject]

## Q:\Test\2019\04\02\SO_55464728.ps1
function Show-Version($version){
    $ver = @()
    for ($i=3; $i -ge 0; $i--) {
       $ver += (($version -band (0xFF -shl ($i*8))) -shr ($i*8))
    }
    [PSCustomObject]@{
        'Input      ' = "{0:D}" -f $version
        'Version Hex' = "0x{0:x2}{1:x2}{2:x2}{3:x2}" -f $ver
        'Version Dec' = "{0}.{1}.{2}.{3}" -f $ver
        'mmMMbbbb'    = "{0}.{1}.{2}" -f $ver[0],$ver[1],($ver[2]*255+$ver[3])
    }
}

Show-Version 0x01020304 # 1.2.3.4
Show-Version 0x22554435
Show-Version 0xa013fab  # 10.1.63.171
Show-Version 33554435   # 2.0.3

示例输出:

> Q:\Test\2019\04\02\SO_55464728.ps1

Input       Version Hex Version Dec mmMMbbbb
----------- ----------- ----------- --------
0x01020304  0x01020304  1.2.3.4     1.2.769
0x22554435  0x22554435  34.85.68.53 34.85.17393
0xa013fab   0x0a013fab  10.1.63.171 10.1.16236
33554435    0x02000003  2.0.0.3     2.0.3

答案 1 :(得分:2)

我认为您只需要使用-band-shr运算符即可从十六进制数字中提取适当的位。

这里是一个示例,您可以根据需要进行修改。

function Show-Version($ver)
{
    "-------------------------------------"
    "Showing version:" + $("{0:X8}" -f $ver) 

    "HEX"
    "{0:x2}" -f (($ver -band 0xFF000000) -shr 24)

    "{0:x2}" -f (($ver -band 0x00FF0000) -shr 16)

    "{0:x2}" -f (($ver -band 0x0000FF00) -shr 8)

    "{0:x2}" -f (($ver -band 0x000000FF) -shr 0)

    "DECIMAL"
    "{0}" -f (($ver -band 0xFF000000) -shr 24)

    "{0}" -f (($ver -band 0x00FF0000) -shr 16)

    "{0}" -f (($ver -band 0x0000FF00) -shr 8)

    "{0}" -f (($ver -band 0x000000FF) -shr 0)
}

Show-Version 0x22554435
Show-Version 0xa013fab # 10.1.63.171
Show-Version 0x01020304 # 1.2.3.4