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コマンドレットを使用して実際のバージョン番号を取得する必要がありますか?
これは、Get-PrinterDriver
のDriverVersion
がタイプ Int64 であるためです。
これを修正する簡単な方法は、以下を使用することです( 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)
何がエレガントで、何が表現力があり、何が簡潔で、何が不可解なa.s.oであるかについて議論する余地はたくさんあります。 -確かにもっと簡潔です-必ずしも良いとは限りません-バージョンは次のようになります:
Get-PrinterDriver | Select-Object Name, @{
n = "DriverVersion"
e = {
$ver = $_.DriverVersion
(3..0 | ForEach-Object { ($ver -shr ($_ * 16)) -band 0xffff }) -join '.'
}
}
ローマへのちょうど別の方法。