使用 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-PrinterDriversDriverVersion是類型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

轉換的工作原理是使用位元運算評估DriverVersion16 位元部分中的每個(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 '.'
      }
}

這只是通往羅馬的另一條路。

相關內容