我正在尝试从Windows注册表中获取软件的版本号。理想情况下,我希望看到版本为2.0.3的版本,但是我得到的版本号为十进制格式33554435。
我尝试将十进制数转换为十六进制数(看起来非常接近版本号2.0.3),但我不知道如何将十六进制数转换为所需的版本号。我读了System.Version和Convert 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
答案 0 :(得分:3)
我不喜欢@KoryGill的重复,否则重复answer(+ 1)。
3..0
的for循环计算应该对掩码也进行乘以8的移位-format
运算符输出整个数组[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