Джероен Мостерт предоставил важные указатели в комментарии к вопросу:
К сожалению, начиная с PowerShell 7.0, Measure-Object
неизменно преобразует входные данные числа [1] для операций -Sum
, -Maximum
, -Minimum
, -Average
и -StandardDeviation
до [double]
(System.Double
) и сообщает результат как этот тип, который может привести к потере точности.
Ваши входные числа имеют тип [long]
, и их значения превышают максимальное целое число, которое может быть точно представлено в [double]
, то есть 9007199254740991
(вы можете вычислить его с помощью [bigint]::pow(2, 53) - 1
)
Эффективным обходным путем является использование LINQ (System.Linq.Enumerable.Max
):
[Linq.Enumerable]::Max(
[long[]] $UserDeets.lastLogon
)
Обратите внимание, что явное [long[]]
приведение необходимо для того, чтобы PowerShell мог вызывать метод generi c .Max()
с конкретным типом.
Другой, менее эффективный, но больше PowerShell-idiomati c обходной путь должен использовать сортировку , аналогично собственному ответу OP :
# Sort the LastLogon property values, then grab the *last* one,
# which is the largest value.
($UserDeets.LastLogon | Sort-Object)[-1]
сортировка только массива .lastLogon
значений, а не полные входные объекты сводит к минимуму ненужные в концептуальном отношении затраты на создание дублированного, отсортированного массива просто так, макс. значение может быть определено.
[1] Обратите внимание, что для -Min
и -Max
non-numberri c входы также принимаются, пока они реализуют интерфейс System.IComparable
, и в этом случае входные данные сохраняются как есть и не происходит потери точности; например, 'c', 'b', 'a' | Measure-Object -Minimum
и [datetime]::now, [datetime]::now.AddDays(1) | Measure-Object -Maximum
работают нормально, потому что оба типа [string]
и [datetime]
реализуют IComparable
.