Получить версию драйвера принтера с помощью командлетов Powershell PrintManagement?

Получить версию драйвера принтера с помощью командлетов Powershell PrintManagement?

Номера версий в графическом интерфейсе выглядят как 10.0.17134.1 и 3.0.8.0, но их эквиваленты (?) из Get-PrinterDriver-cmdlet выглядят по меньшей мере загадочно:

Get-PrinterDriver | Select-Object Name, MajorVersion, DriverVersion

дает мне такой вывод:

Name                   MajorVersion    DriverVersion
----                   ------------    -------------
Microsoft XPS Docu...             4 2814750890000385
Samsung Universal ...             3  844424930656256

Так мне действительно нужно использовать командлеты WMI/CIM, чтобы получитьнастоящийномера версий?

решение1

Это потому, что Get-PrinterDriver's DriverVersionимеет типUInt64:

введите описание изображения здесь

Прорывной способ исправить это — использовать следующее (источник). Я надеюсь, что есть более элегантный способ переформулировать эти значения в ожидаемом нами формате, хотя я ценю, насколько прозрачен этот метод для лучшего понимания происходящего.

Get-PrinterDriver | Select-Object Name,@{
    n="DriverVersion";e={

        $ver = $_.DriverVersion
        $rev = $ver -band 0xffff
        $build = ($ver -shr 16) -band 0xffff
        $minor = ($ver -shr 32) -band 0xffff
        $major = ($ver -shr 48) -band 0xffff
        "$major.$minor.$build.$rev"

    }
}

Первый результат при запуске на моей машине:

Name                                                    DriverVersion 
----                                                    ------------- 
Send to Microsoft OneNote 16 Driver                     16.0.7629.4000

Преобразование работает с использованиемпобитовая операциядля оценки каждого DriverVersion(64 бит) разделами по 16 бит, чтобы определить основной и дополнительный номера, а также номера сборки и ревизии.

Например, первый DriverVersionна моей машине, как 64-битное число, это 4503600127348640. Вотпобитовое И( -band) происходит во время определения переменной $rev, показано в двоичном виде:

‭00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
                                        1111111111111111 (65535, aka "0xffff")
                                    =   0000111110100000 (4000)
                                                         (DriverVersion = X.Y.Z.4000)

Вот $build, который также использует -shr(сдвиг бита вправо):

‭00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
                        1111111111111111                 (65535)
                    =   0001110111001101                 (7629)
                                                         (DriverVersion = X.Y.7629.4000)

Вот $minor:

‭00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
        1111111111111111                                 (65535)
    =   0000000000000000                                 (0)
                                                         (DriverVersion = X.0.7629.4000)

Окончательно, $major:

00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
11111111                                                 (65535)
00010000                                                 (16)
                                                         (DriverVersion = 16.0.7629.4000)

решение2

Можно долго спорить о том, что элегантно, что выразительно, что кратко, что загадочно и т. д. Безусловно, более краткая — не обязательно лучшая — версия могла бы выглядеть следующим образом:

Get-PrinterDriver | Select-Object Name, @{ 
  n = "DriverVersion"
  e = {
        $ver = $_.DriverVersion
        (3..0 | ForEach-Object { ($ver -shr ($_ * 16)) -band 0xffff }) -join '.'
      }
}

Еще один путь в Рим.

Связанный контент