Recuperar a versão do driver da impressora com cmdlets Powershell PrintManagement?

Recuperar a versão do driver da impressora com cmdlets Powershell PrintManagement?

Os números de versão na GUI parecem 10.0.17134.1 e 3.0.8.0, mas seus equivalentes (?) do Get-PrinterDriver-cmdlet parecem pelo menos enigmáticos:

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

me dá uma saída como esta:

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

Então, eu realmente preciso usar os cmdlets WMI/CIM para obter orealnúmeros de versão?

Responder1

Isso ocorre porque Get-PrinterDriver's DriverVersioné do tipoUInt64:

insira a descrição da imagem aqui

Uma maneira inovadora de corrigir isso é usar o seguinte (fonte). Espero que haja uma forma mais elegante de reformular estes valores no formato que esperamos, embora aprecie o quão transparente este método é para melhor compreender o que está a acontecer.

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"

    }
}

O primeiro resultado disso quando executado na minha máquina é:

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

A conversão funciona usandooperação bit a bitpara avaliar cada um DriverVersion(64 bits) em seções de 16 bits para determinar os números principais, secundários, de construção e de revisão.

Por exemplo, o primeiro DriverVersionna minha máquina, como um número de 64 bits, é 4503600127348640. Aqui está oE bit a bit( -band) acontecendo durante a definição da $revvariável, mostrada em binário:

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

Aqui está $build, que também usa -shr(bit shift-direita):

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

Aqui 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)

Responder2

Há muito espaço para discutir sobre o que é elegante, o que é expressivo, o que é conciso, o que é enigmático também - Uma versão certamente mais breve - não necessariamente melhor - seria a seguinte:

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

Apenas outro caminho para Roma.

informação relacionada