我可以控制cmdlet显示的DateTime格式吗?

时间:2015-04-20 23:01:50

标签: datetime powershell cmdlets

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

但是,使用format-list或format-table时,输出只显示秒数,例如4/15/2015 5:31:30 PM。我宁愿使用fff time format代替。

我知道实际数据没有舍入,因为如果我在DateTime值上查询Millisecond属性,我会看到正确的值。例如,对于给定的输出$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的用户不必进行任何额外的工作来查看毫秒数。

2 个答案:

答案 0 :(得分:3)

您可以要求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
显然,后者会影响所有日期到字符串的转换,因此请小心使用。

答案 1 :(得分:1)

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属性的对象的部分,以及在对其进行排序之前对其执行的操作。