我拥有一个带有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的用户不必进行任何额外的工作来查看毫秒数。
答案 0 :(得分:3)
您可以要求Format-Table
将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
或者,您可以设置当前线程的长时间模式以显示毫秒:
$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-Table
和Format-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
属性的对象的部分,以及在对其进行排序之前对其执行的操作。