Die Versionsnummern in der GUI sehen aus wie 10.0.17134.1 und 3.0.8.0, aber ihre Äquivalente (?) aus dem Get-PrinterDriver
-cmdlet sehen zumindest kryptisch aus:
Get-PrinterDriver | Select-Object Name, MajorVersion, DriverVersion
gibt mir eine Ausgabe wie diese:
Name MajorVersion DriverVersion
---- ------------ -------------
Microsoft XPS Docu... 4 2814750890000385
Samsung Universal ... 3 844424930656256
Muss ich wirklich die WMI/CIM-Cmdlets verwenden, um dierealVersionsnummern?
Antwort1
Dies liegt daran, dass Get-PrinterDriver
es DriverVersion
vom Typ istUInt64:
Eine schnelle Möglichkeit, dieses Problem zu beheben, besteht darin, Folgendes zu verwenden (Quelle). Ich hoffe, es gibt eine elegantere Möglichkeit, diese Werte in das erwartete Format umzuwandeln, obwohl ich die Transparenz dieser Methode schätze, mit der man am besten versteht, was vor sich geht.
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"
}
}
Das erste Ergebnis beim Ausführen auf meinem Computer ist:
Name DriverVersion
---- -------------
Send to Microsoft OneNote 16 Driver 16.0.7629.4000
Die Konvertierung erfolgt überbitweise Operationum jedes (64 Bit) in Abschnitten von 16 Bit auszuwerten DriverVersion
, um die Haupt-, Neben-, Build- und Revisionsnummern zu bestimmen.
Beispielsweise DriverVersion
ist die erste Zahl auf meinem Rechner als 64-Bit-Zahl 4503600127348640
. Hier ist diebitweises UND( -band
) geschieht während der Definition der $rev
Variablen, binär dargestellt:
00010000000000000000000000011101110011010000111110100000 (4503600127348640)
1111111111111111 (65535, aka "0xffff")
= 0000111110100000 (4000)
(DriverVersion = X.Y.Z.4000)
Hier ist $build
, das auch -shr
( verwendet.Bit-Rechtsverschiebung):
00010000000000000000000000011101110011010000111110100000 (4503600127348640)
1111111111111111 (65535)
= 0001110111001101 (7629)
(DriverVersion = X.Y.7629.4000)
Hier ist $minor
:
00010000000000000000000000011101110011010000111110100000 (4503600127348640)
1111111111111111 (65535)
= 0000000000000000 (0)
(DriverVersion = X.0.7629.4000)
Endlich, $major
:
00010000000000000000000000011101110011010000111110100000 (4503600127348640)
11111111 (65535)
00010000 (16)
(DriverVersion = 16.0.7629.4000)
Antwort2
Es gibt viel Raum für Diskussionen darüber, was elegant, was ausdrucksstark, was prägnant, was kryptisch usw. ist. Eine sicherlich kürzere – aber nicht unbedingt bessere – Version wäre die folgende:
Get-PrinterDriver | Select-Object Name, @{
n = "DriverVersion"
e = {
$ver = $_.DriverVersion
(3..0 | ForEach-Object { ($ver -shr ($_ * 16)) -band 0xffff }) -join '.'
}
}
Nur ein anderer Weg nach Rom.