Это потому, что Get-PrinterDriver
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
(bit shift-right):
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)