Druckertreiberversion mit Powershell PrintManagement-Cmdlets abrufen?

Druckertreiberversion mit Powershell PrintManagement-Cmdlets abrufen?

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-PrinterDriveres DriverVersionvom Typ istUInt64:

Bildbeschreibung hier eingeben

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 DriverVersionist die erste Zahl auf meinem Rechner als 64-Bit-Zahl 4503600127348640. Hier ist diebitweises UND( -band) geschieht während der Definition der $revVariablen, 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.

verwandte Informationen