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

TNT*_*TNT 4 printer powershell wmi

GUI 中的版本号看起来像 10.0.17134.1 和 3.0.8.0,但 -cmdlet 中的等效版本号(?)Get-PrinterDriver看起来至少很神秘:

Get-PrinterDriver | Select-Object Name, MajorVersion, DriverVersion
Run Code Online (Sandbox Code Playgroud)

给我这样的输出:

Name                   MajorVersion    DriverVersion
----                   ------------    -------------
Microsoft XPS Docu...             4 2814750890000385
Samsung Universal ...             3  844424930656256
Run Code Online (Sandbox Code Playgroud)

那么我真的需要使用 WMI/CIM cmdlet 来获取真实的版本号吗?

roo*_*oot 5

这是因为Get-PrinterDriver\'sDriverVersion的类型为UInt64

\n\n

在此输入图像描述

\n\n

解决此问题的突破方法是使用以下内容(源代码)。我希望有一种更优雅的方式以我们期望的格式重新转换这些值,尽管我很欣赏这种方法的透明性,可以最好地理解正在发生的事情。

\n\n
Get-PrinterDriver | Select-Object Name,@{\n    n="DriverVersion";e={\n\n        $ver = $_.DriverVersion\n        $rev = $ver -band 0xffff\n        $build = ($ver -shr 16) -band 0xffff\n        $minor = ($ver -shr 32) -band 0xffff\n        $major = ($ver -shr 48) -band 0xffff\n        "$major.$minor.$build.$rev"\n\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我的机器上运行时的第一个结果是:

\n\n
Name                                                    DriverVersion \n----                                                    ------------- \nSend to Microsoft OneNote 16 Driver                     16.0.7629.4000\n
Run Code Online (Sandbox Code Playgroud)\n\n

该转换通过使用按位运算来评估DriverVersion16 位部分中的每个(64 位)来确定主要版本号、次要版本号、内部版本号和修订号。

\n\n

例如,DriverVersion我的机器上的第一个 64 位数字是4503600127348640. 以下是变量定义期间发生的按位 AND ( ) ,以二进制形式显示:-band$rev

\n\n
\xe2\x80\xad00010000000000000000000000011101110011010000111110100000\xe2\x80\xac (4503600127348640)\n                                        1111111111111111 (65535, aka "0xffff")\n                                    =   0000111110100000 (4000)\n                                                         (DriverVersion = X.Y.Z.4000)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是$build,它也使用-shr位右移):

\n\n
\xe2\x80\xad00010000000000000000000000011101110011010000111110100000\xe2\x80\xac (4503600127348640)\n                        1111111111111111                 (65535)\n                    =   0001110111001101                 (7629)\n                                                         (DriverVersion = X.Y.7629.4000)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是$minor

\n\n
\xe2\x80\xad00010000000000000000000000011101110011010000111110100000\xe2\x80\xac (4503600127348640)\n        1111111111111111                                 (65535)\n    =   0000000000000000                                 (0)\n                                                         (DriverVersion = X.0.7629.4000)\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,$major

\n\n
00010000000000000000000000011101110011010000111110100000\xe2\x80\xac (4503600127348640)\n11111111                                                 (65535)\n00010000                                                 (16)\n                                                         (DriverVersion = 16.0.7629.4000)\n
Run Code Online (Sandbox Code Playgroud)\n