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-PrinterDriver
cmdlet 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 DriverVersion
es de tipoUInt64:
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 DriverVersion
en 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 $rev
variable, 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.