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
sDriverVersion
是類型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
16 位元部分中的每個(64 位元)以確定主要版本號、次要版本號、內部版本號和修訂號。
例如,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 '.'
}
}
這只是通往羅馬的另一條路。