Как преобразовать шестнадцатеричное значение в номер версии в powershell - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь получить номер версии программного обеспечения из реестра Windows.В идеале я хотел бы видеть версию в формате 2.0.3, но номер версии, который я получаю, находится в десятичном формате 33554435.

Я попытался преобразовать десятичное число в шестнадцатеричное число (которое выглядит довольно близко кномер версии 2.0.3), но я не знаю, как преобразовать шестнадцатеричное число в желаемый номер версии.Я прочитал System.Version и Преобразование десятичного числа в шестнадцатеричное и двоичное , но я застрял сейчас.Все, что я могу придумать, это извлечь числа 2, 0 и 3, чтобы я мог поместить их в строку, но это не идеально, так как не будет работать должным образом, если я обновлю программное обеспечение до более новой версии.Любая помощь приветствуется!

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

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

Мне не понравились повторы в @ KoryGill s, в остальном хорошо ответ (+ 1).

  • a для циклической остановки вниз 3..0 следует выполнить сдвиг, умноженный на 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
2 голосов
/ 02 апреля 2019

Я думаю, вам просто нужно использовать операторы -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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...