Powershell中的datetime与System.DateTime和ConvertTo-Json

时间:2017-09-06 16:36:51

标签: powershell

我正在尝试捕获一些文件信息并将其存储为JSON。我遇到的问题是我最终得到了两种不同的日期序列化为JSON。

这个脚本......

cd ~
$Index = 'fileInfo.json'
$Members = 'members.txt'

$data = Get-ChildItem | Select-Object -First 1 |
    Select-Object -Property CreationTime ,
        @{Name="AsOf";Expression={(Get-Date) -as [datetime]}} 

$data | Get-Member | Out-File $Members
$data | ConvertTo-Json | Out-File $Index

#$reloaded = cat $Index | ConvertFrom-Json

...生成此JSON

{
    "CreationTime":  "\/Date(1423230920315)\/",
    "AsOf":  {
                 "value":  "\/Date(1504713920338)\/",
                 "DisplayHint":  2
             }
}

两个日期,CreationTime& AsOf,显示为不同的类型:

Name         MemberType   Definition                               
----         ----------   ----------                               
AsOf         NoteProperty System.DateTime AsOf=9/6/2017 12:21:30 PM
CreationTime NoteProperty datetime CreationTime=2/6/2015 8:55:20 AM

CreationDate(类型'datetime')以更便携的格式序列化。

有没有办法将System.dateTime强制转换为'datetime'? '-as datetime'似乎没有帮助。感谢

1 个答案:

答案 0 :(得分:2)

克里斯,你的问题让我疯狂。但经过一些研究,这就是我得到的。你来自" CreationTime"实际上是NTFS(link)的时间戳,它是通过C ++核心完成的。然后,当您通过powershell获得时间时,它会在转换为[datetime]时使用.Net框架。这是主要区别,甚至它确实说日期时间,它不是" System.DateTime"因为来源不同。

我的解决方案就是这个,如果你真的希望它是C ++的日期时间而不是C#。

New-Item -ItemType Directory -Path .\test123
$Today = Get-Item -Path .\test123 | Select-Object -Property CreationTime
$Creation = Get-ChildItem | Select-Object -First 1 | Select-Object -Property CreationTime
$data = New-Object PSObject
Add-Member -type NoteProperty -Name CreationTime -InputObject $data -Value $Creation.CreationTime
Add-Member -type NoteProperty -Name AsOf -InputObject $data -Value $Today.CreationTime
Remove-Item .\test123