¿Recuperar la versión del controlador de la impresora con los cmdlets de Powershell PrintManagement?

¿Recuperar la versión del controlador de la impresora con los cmdlets de Powershell PrintManagement?

Los números de versión en la interfaz gráfica de usuario se parecen a 10.0.17134.1 y 3.0.8.0, pero sus equivalentes (?) del Get-PrinterDrivercmdlet parecen al menos crípticos:

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

me da una salida como esta:

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

Entonces, ¿realmente necesito usar los cmdlets WMI/CIM para obtener elrealnúmeros de versión?

Respuesta1

Esto se debe a que Get-PrinterDriver's DriverVersiones de tipoUInt64:

ingrese la descripción de la imagen aquí

Una forma alternativa de solucionar este problema es utilizar lo siguiente (fuente). Espero que haya una forma más elegante de reformular estos valores en el formato que esperamos, aunque aprecio lo transparente que es este método para comprender mejor lo que está sucediendo.

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"

    }
}

El primer resultado de esto cuando lo ejecuto en mi máquina es:

Name                                                    DriverVersion 
----                                                    ------------- 
Send to Microsoft OneNote 16 Driver                     16.0.7629.4000

La conversión funciona usandooperación bit a bitpara evaluar cada uno DriverVersion(64 bits) en secciones de 16 bits para determinar los números mayor, menor, de compilación y de revisión.

Por ejemplo, el primero DriverVersionen mi máquina, como número de 64 bits, es 4503600127348640. Aquí está elbit a bit Y( -band) sucediendo durante la definición de la $revvariable, que se muestra en binario:

‭00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
                                        1111111111111111 (65535, aka "0xffff")
                                    =   0000111110100000 (4000)
                                                         (DriverVersion = X.Y.Z.4000)

Aquí está $build, que también usa -shr(bit de desplazamiento a la derecha):

‭00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
                        1111111111111111                 (65535)
                    =   0001110111001101                 (7629)
                                                         (DriverVersion = X.Y.7629.4000)

Aquí está $minor:

‭00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
        1111111111111111                                 (65535)
    =   0000000000000000                                 (0)
                                                         (DriverVersion = X.0.7629.4000)

Finalmente, $major:

00010000000000000000000000011101110011010000111110100000‬ (4503600127348640)
11111111                                                 (65535)
00010000                                                 (16)
                                                         (DriverVersion = 16.0.7629.4000)

Respuesta2

Hay mucho espacio para discutir sobre qué es elegante, qué es expresivo, qué es conciso, qué es críptico también. Una versión ciertamente más breve, no necesariamente mejor, sería la siguiente:

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

Sólo otra forma de llegar a Roma.

información relacionada