Datetime 我可以控制cmdlet显示的日期时间格式吗?

Datetime 我可以控制cmdlet显示的日期时间格式吗?,datetime,powershell,cmdlets,Datetime,Powershell,Cmdlets,我拥有一个带有DateTime属性的cmdlet,该属性表示服务器上事件的时间戳。cmdlet读取服务器上的日志并输出一些信息。由于一系列事件可以在短时间内发生,因此毫秒精度对于输出的用户非常重要 但是,当使用格式列表或格式表时,输出仅显示秒数,例如4/15/2015 5:31:30 PM。我更愿意用这个来代替 我知道实际数据并不是四舍五入的,因为如果我查询DateTime值的毫秒属性,我会看到正确的值。例如,对于给定的输出$event,如果我的日志行具有时间戳2015-04-16T00:31:

我拥有一个带有DateTime属性的cmdlet,该属性表示服务器上事件的时间戳。cmdlet读取服务器上的日志并输出一些信息。由于一系列事件可以在短时间内发生,因此毫秒精度对于输出的用户非常重要

但是,当使用格式列表或格式表时,输出仅显示秒数,例如
4/15/2015 5:31:30 PM
。我更愿意用这个来代替

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

我是否可以在cmdlet中指定DateTime应以毫秒为单位显示?例如,当用户键入:

> Get-LogInfo | ft
我希望在默认情况下显示:

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

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

格式表和格式列表(不太经常)都将以静默方式更改对象属性和类型。它们应该是整理信息以供显示的最后一件事情之一。根据脚本中的内容,它们很容易成为问题的罪魁祸首

你说的话让我觉得最突出的是:

毫秒是不正常的

这告诉我,在您尝试对对象属性进行排序时,它实际上不是一个
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
专门将
日期时间
转换为fff表示法:

PS C:\>(get-date).ToString("MM/dd/yyyy HH:mm:ss.fff")
04/20/2015 18:01:22.710
我使用了一种格式,其中包括一位数的月份/分钟/小时的前导零,等等。。。降低字母排序与数字排序行为不同的风险。与上面的注释类似,最好确保排序在任何其他格式化活动之前进行,以获得最准确的结果


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

您可以要求
格式化表
DateTime
转换为字符串,但您需要:

$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
Text dt
---- --
test 4/21/2015 10:24:08.877
或者,您可以将当前线程的长时间模式设置为显示毫秒:

$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 time with milliseconds
---- ----------------------
test 18:08:51.725
Text dt
---- --
test 4/21/2015 10:24:08.877

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

添加仅用于显示的属性有什么不对?事实上,DateTime已经做到了。类似地,我将向事件对象添加一个扩展脚本属性以进行显示。据我所知,唯一可以改变其显示方式的其他方法将影响当前会话/进程中的所有日期时间(例如,弄乱DateTimeFormatInfo的LongTimeFormat)。@mikez我担心如果有人将输出传输到格式列表,会混淆两个时间属性。我已经有了很多属性(比我想要的要多),删除DateTime版本对于我的一些用户和消费工具来说将是一个突破性的改变。我需要支持一个相当多的受众。”Turyon考虑如果你有太多的属性,就定义一个默认的显示属性集。我在排序中出错了,但是删除了那个位,因为我的主要目标是找出我是否能影响格式表和格式列表。我的cmdlet被我的用户直接传送到ft或fl以显示一批结果。在这种情况下,我有点喜欢n0rd的答案作为另一个选项。:)