0

在 powershell 中,如果我这样做(gwmi win32_bios).releasedate | convertto-json,我会得到"20171221000000.000000+000",这是有道理的 - 2017 年 12 月 21 日。

但是,如果我采用 CimInstanceProperties 列表中的等效元素,例如,

$a = (Get-CimInstance cim_bioselement).CimInstanceProperties | `
where-object {$_.name -eq 'ReleaseDate'}

然后检查$a.value,我得到

Wednesday, December 20, 2017 6:00:00 PM

但做$a | ConvertTo-Json产量

{
    "Name":  "ReleaseDate",
    "Value":  "\/Date(1513814400000)\/",
    "CimType":  13,
    "Flags":  "Property, ReadOnly, NotModified",
    "IsValueModified":  false
}

我猜想这两个日期是等价的,但我没有立即了解 jsonification 后 CIM 值的格式是什么。我可以从不同的机器上获取更多的 BIOS 日期并开始分析,但很好奇是否有人知道“他们的头顶上”的格式是什么。

我想了解格式的原因是因为如果我通常尝试通过

(Get-CimInstance cim_bioselement).CimInstanceProperties | convertto-json
4

1 回答 1

2

有一个用于解码 CIMDATE 的内置方法:

Get-WmiObject Win32_BIOS -Property ReleaseDate | 
    Select-Object @{n='ReleaseDate';e={$_.ConvertToDateTime($_.ReleaseDate)}}

但是,除非您使用的是 PowerShell v1/v2 或遇到问题,否则您应该使用Get-CimInstanceover,Get-WmiObject因为它会为您完成转换并且更简洁:

PS> Get-CimInstance Win32_BIOS -Property ReleaseDate | Select-Object ReleaseDate

ReleaseDate
-----------
8/5/2014 8:00:00 PM

为避免 Microsoft 愚蠢的非标准 JSON 日期语法,请自行将日期格式化为正确 ISO 8601 格式的字符串:

PS> Get-CimInstance Win32_BIOS -Property ReleaseDate |
    Select-Object @{n='ReleaseDate';e={$_.ReleaseDate.ToString('yyyy-MM-ddTHH:mm:ss.fffZ')}}

ReleaseDate
-----------
2014-08-05T20:00:00.000Z

PS> Get-CimInstance Win32_BIOS -Property ReleaseDate
    | Select-Object @{n = 'ReleaseDate'; e = {$_.ReleaseDate.ToString('yyyy-MM-ddTHH:mm:ss.fffZ')}}
    | ConvertTo-Json
{
    "ReleaseDate":  "2014-08-05T20:00:00.000Z"
}
于 2018-03-29T18:11:01.307 回答