Powershell PrintManagement コマンドレットを使用してプリンター ドライバーのバージョンを取得しますか?

Powershell PrintManagement コマンドレットを使用してプリンター ドライバーのバージョンを取得しますか?

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コマンドレットを使って取得する必要があるのでしょうか?本物バージョン番号は?

答え1

これはGet-PrinterDriverDriverVersion型が64進数:

ここに画像の説明を入力してください

これを修正する画期的な方法は、以下を使用することです(ソース)。何が起こっているかを最もよく理解するには、この方法の透明性が重要だとは思いますが、これらの値を期待する形式で再キャストするよりエレガントな方法があることを願っています。

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

変換は以下を使用して行われますビット演算それぞれ (64 ビット) を 16 ビットのセクションで評価し、DriverVersionメジャー、マイナー、ビルド、およびリビジョン番号を決定します。

たとえば、DriverVersion私のマシンの最初の64ビットの数値は です4503600127348640ビットAND-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 '.'
      }
}

ローマへのもう一つの道。

関連情報