gpt4 book ai didi

powershell - 如何防止 PowerShell 的 Measure-Object cmdlet 截断您的数据?

转载 作者:行者123 更新时间:2023-12-03 21:19:54 29 4
gpt4 key购买 nike

我正在尝试比较以下数据以获得最大的数字:

$UserDeets 

name lastLogon
---- ---------
Frank Ti 132273694413991065
Frank Ti 132279742884182029
Frank Ti 132282196073500496
Frank Ti 132272912975826719
Frank Ti 132282144707771693
Frank Ti 132228790551703041

为此,我尝试使用内置的“测量”功能。这是我正在执行的代码
($UserDeets| measure -Property lastLogon -Maximum ).Maximum

结果如下
1.322821960735E+17

正如您所看到的,它正在返回正确的数据,它正在截断最后几位数字。

有没有办法防止这种截断?

最佳答案

Jeroen Mostert在对该问题的评论中提供了关键指示:

不幸的是,从 PowerShell 7.0 开始, Measure-Object 总是将输入数字 [1] 转换为 -Sum , -Maximum , -Minimum , -Average-StandardDeviation[double] 的操作( System.Double ) 并将结果报告为该类型,这可能导致精度损失。

  • js2010this GitHub issue 中报告了这种令人惊讶的行为.

  • 您输入的数字类型为 [long] ,并且它们的值超过了 [double] 中可以精确表示的最大整数,即 9007199254740991 (你可以用 [bigint]::pow(2, 53) - 1 来计算)

    一个有效的解决方法是使用 LINQ ( System.Linq.Enumerable.Max ):
    [Linq.Enumerable]::Max(
    [long[]] $UserDeets.lastLogon
    )

    请注意,显式 [long[]]为了使 PowerShell 能够调用通用 .Max(),需要进行强制转换。具有具体类型的方法。

    另一个, 效率较低,但更符合 PowerShell 惯用的解决方法 是使用排序,类似于 OP's own answer :
    # Sort the LastLogon property values, then grab the *last* one,
    # which is the largest value.
    ($UserDeets.LastLogon | Sort-Object)[-1]

    仅对 .lastLogon 的数组进行排序值而不是完整的输入对象,最大限度地减少了创建重复的排序数组的概念上不必要的开销,因此最大值。值可以确定。

    [1] 请注意,对于 -Min-Max也接受非数字输入,只要它们实现 System.IComparable 接口(interface),在这种情况下,输入保持原样,不会发生精度损失;例如, 'c', 'b', 'a' | Measure-Object -Minimum[datetime]::now, [datetime]::now.AddDays(1) | Measure-Object -Maximum工作正常,因为类型 [string][datetime]都实现 IComparable .

    关于powershell - 如何防止 PowerShell 的 Measure-Object cmdlet 截断您的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60598648/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com