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-PrinterDriver
的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 '.'
}
}
这只是去往罗马的另一种方式。