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:
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 DriverVersion
na minha máquina, como um número de 64 bits, é 4503600127348640
. Aqui está oE bit a bit( -band
) acontecendo durante a definição da $rev
variá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.