web-dev-qa-db-ja.com

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

GUIのバージョン番号は10.0.17134.1および3.0.8.0のように見えますが、Get-PrinterDriver-コマンドレットの同等のバージョン(?)は少なくとも不可解に見えます。

Get-PrinterDriver | Select-Object Name, MajorVersion, DriverVersion

次のような出力が得られます。

Name                   MajorVersion    DriverVersion
----                   ------------    -------------
Microsoft XPS Docu...             4 2814750890000385
Samsung Universal ...             3  844424930656256

では、本当にWMI/CIMコマンドレットを使用して実際のバージョン番号を取得する必要がありますか?

1
TNT

これは、Get-PrinterDriverDriverVersionがタイプ Int64 であるためです。

enter image description here

これを修正する簡単な方法は、以下を使用することです( source )。これらの値を期待する形式に再キャストするよりエレガントな方法があることを願っていますが、この方法が何が起こっているのかを最もよく理解するためにどれほど透過的であるかを理解しています。

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

変換は、 ビット演算 を使用して16ビットのセクションで各DriverVersion(64ビット)を評価し、メジャー、マイナー、ビルド、およびリビジョン番号を決定することによって機能します。

たとえば、私のマシンの最初のDriverVersionは、64ビットの数値としては4503600127348640です。 -band変数の定義中に発生する ビット単位のAND$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)
1
root

何がエレガントで、何が表現力があり、何が簡潔で、何が不可解なa.s.oであるかについて議論する余地はたくさんあります。 -確かにもっと簡潔です-必ずしも良いとは限りません-バージョンは次のようになります:

Get-PrinterDriver | Select-Object Name, @{ 
  n = "DriverVersion"
  e = {
        $ver = $_.DriverVersion
        (3..0 | ForEach-Object { ($ver -shr ($_ * 16)) -band 0xffff }) -join '.'
      }
}

ローマへのちょうど別の方法。

0
TNT