【问题标题】:Can I control the DateTime format displayed by my cmdlet?我可以控制我的 cmdlet 显示的 DateTime 格式吗?
【发布时间】:2015-06-27 21:21:21
【问题描述】:

我拥有一个带有 DateTime 属性的 cmdlet,该属性表示服务器上事件的时间戳。 cmdlet 读取服务器上的日志并输出一些信息。由于在很短的窗口内可能会发生大量事件,因此毫秒精度对于输出用户来说很重要。

但是,当使用 format-list 或 format-table 时,输出仅显示秒数,例如4/15/2015 5:31:30 PM。我更喜欢使用fff time format

我知道实际数据没有四舍五入,因为如果我查询我的 DateTime 值的毫秒属性,我会看到正确的值。例如,对于给定的输出$event,如果我的日志行有时间戳2015-04-16T00:31:30.525Z$event.Timestamp.Millisecond 返回 525。

我可以在我的 cmdlet 中做些什么来指定 DateTime 应该以毫秒为单位显示吗?例如,当用户键入:

> Get-LogInfo | ft

我想默认显示:

Timestamp              EventData
---------              -------
4/15/2015 17:31:28.525 (data)

我也希望格式列表有类似的行为。理想情况下,该 cmdlet 的用户不需要做任何额外的工作来查看毫秒数。

【问题讨论】:

  • 添加一个仅用于显示的属性有什么问题?实际上,DateTime 已经这样做了。同样,我会向事件对象添加扩展脚本属性以进行显示。我所知道的唯一可以改变它们显示方式的其他方法将影响当前会话/进程中的所有 DateTimes(例如,弄乱 DateTimeFormatInfo 的 LongTimeFormat)。
  • @mikez 如果有人将输出通过管道传输到 Format-List,我担心会混淆两个时间属性。我已经有很多属性(比我想要的更多),删除 DateTime 版本对于我的一些用户和消费工具来说将是一个重大变化。我需要支持相当多样化的受众。
  • @Troyen 如果属性太多,请考虑定义默认显示属性集。

标签: datetime powershell cmdlets


【解决方案1】:

您可以要求Format-TableDateTime 转换为您想要的字符串:

$t = New-Object psobject -Property @{Text ="test"; dt = (Get-Date)}
$t | ft Text,@{expression={"{0:HH:mm:ss.fff}" -f $_.dt};label="time with milliseconds"} -AutoSize

打印:

Text time with milliseconds
---- ----------------------
test 18:08:51.725

或者,您可以设置当前线程的长时间模式以显示毫秒:

$t = New-Object psobject -Property @{Text ="test"; dt = (Get-Date)}
[System.Threading.Thread]::CurrentThread.CurrentCulture.DateTimeFormat.LongTimePattern = 'HH:mm:ss.fff'
$t | ft * -AutoSize

打印:

Text dt
---- --
test 4/21/2015 10:24:08.877

显然,后者会影响所有日期到字符串的转换,因此请谨慎使用。

【讨论】:

    【解决方案2】:

    Format-TableFormat-List(较少)都会默默地更改对象属性和类型。它们应该是您整理信息以供显示的最后一件事。根据您在脚本中的位置,它们很容易成为您问题的罪魁祸首。

    你所说的让我印象深刻的是:

    毫秒数不正常。

    这告诉我,当您尝试对其进行排序时,您的对象属性实际上不是 DateTime 对象。您会看到“字母”排序与“数字”排序的效果。

    简短示例:

    PS C:\>$ints = 5200,310,560,290
    PS C:\>$strings = "5200","310","560","290"
    PS C:\>$strings | Sort-Object
    290
    310
    5200
    560
    PS C:\>$ints | Sort-Object
    290
    310
    560
    5200
    

    专门将 DateTime 转换为 fff 表示法:

    PS C:\>(get-date).ToString("MM/dd/yyyy HH:mm:ss.fff")
    04/20/2015 18:01:22.710
    

    我使用了一种格式,其中包括单个数字月/分钟/小时等的前导零...以降低字母排序与数字排序不同的风险。与上述类似,最好确保在任何其他格式化活动之前进行排序以获得最准确的结果。

    如果这还不足以帮助解决问题,那么查看一些脚本/代码会有所帮助。特别是生成包含DateTime 属性的对象的部分,以及在对其进行排序之前对其进行的处理。

    【讨论】:

    • 我在排序时弄错了,但删除了那个位,因为我的主要目标是找出我是否可以影响 Format-Table 和 Format-List。我的 cmdlet 被我的用户直接通过管道传输到 ft 或 fl 以显示一批结果。
    • 好吧,在那种情况下,我有点喜欢 n0rd 的答案作为另一种选择。 :)
    猜你喜欢
    • 2020-10-27
    • 2011-09-18
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多