Номера версий в графическом интерфейсе выглядят как 10.0.17134.1 и 3.0.8.0, но их эквиваленты (?) из Get-PrinterDriver
-cmdlet выглядят по меньшей мере загадочно:
Get-PrinterDriver | Select-Object Name, MajorVersion, DriverVersion
дает мне такой вывод:
Name MajorVersion DriverVersion
---- ------------ -------------
Microsoft XPS Docu... 4 2814750890000385
Samsung Universal ... 3 844424930656256
Так мне действительно нужно использовать командлеты WMI/CIM, чтобы получитьнастоящийномера версий?
решение1
Это потому, что Get-PrinterDriver
's DriverVersion
имеет типUInt64:
Прорывной способ исправить это — использовать следующее (источник). Я надеюсь, что есть более элегантный способ переформулировать эти значения в ожидаемом нами формате, хотя я ценю, насколько прозрачен этот метод для лучшего понимания происходящего.
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"
}
}
Первый результат при запуске на моей машине:
Name DriverVersion
---- -------------
Send to Microsoft OneNote 16 Driver 16.0.7629.4000
Преобразование работает с использованиемпобитовая операциядля оценки каждого DriverVersion
(64 бит) разделами по 16 бит, чтобы определить основной и дополнительный номера, а также номера сборки и ревизии.
Например, первый DriverVersion
на моей машине, как 64-битное число, это 4503600127348640
. Вотпобитовое И( -band
) происходит во время определения переменной $rev
, показано в двоичном виде:
00010000000000000000000000011101110011010000111110100000 (4503600127348640)
1111111111111111 (65535, aka "0xffff")
= 0000111110100000 (4000)
(DriverVersion = X.Y.Z.4000)
Вот $build
, который также использует -shr
(сдвиг бита вправо):
00010000000000000000000000011101110011010000111110100000 (4503600127348640)
1111111111111111 (65535)
= 0001110111001101 (7629)
(DriverVersion = X.Y.7629.4000)
Вот $minor
:
00010000000000000000000000011101110011010000111110100000 (4503600127348640)
1111111111111111 (65535)
= 0000000000000000 (0)
(DriverVersion = X.0.7629.4000)
Окончательно, $major
:
00010000000000000000000000011101110011010000111110100000 (4503600127348640)
11111111 (65535)
00010000 (16)
(DriverVersion = 16.0.7629.4000)
решение2
Можно долго спорить о том, что элегантно, что выразительно, что кратко, что загадочно и т. д. Безусловно, более краткая — не обязательно лучшая — версия могла бы выглядеть следующим образом:
Get-PrinterDriver | Select-Object Name, @{
n = "DriverVersion"
e = {
$ver = $_.DriverVersion
(3..0 | ForEach-Object { ($ver -shr ($_ * 16)) -band 0xffff }) -join '.'
}
}
Еще один путь в Рим.