使用 Powershell PrintManagement cmdlet 检索打印机驱动程序版本?

使用 Powershell PrintManagement cmdlet 检索打印机驱动程序版本?

GUI 中的版本号看起来像 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 cmdlet 来获取真实的版本号?

答案1

这是因为Get-PrinterDriverDriverVersion类型为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 '.'
      }
}

这只是去往罗马的另一种方式。

相关内容