PowerShell中如何在计算属性里转换日期字符串为[datetime]并正确排序
解决JSON属性重命名与日期排序问题
问题描述
给定JSON数据如下:
[ { "Title":"stackoverflow", "URL":"https://stackoverflow.com", "Modified Time":"" }, { "Title":"example", "URL":"https://example.com", "Modified Time": "11/01/2022 14:38:48" }, { "Title":"reddit", "URL":"https://reddit.com", "Modified Time": "11/01/2023 14:38:48" }, { "Title":"bbc", "URL":"https://bbc.com", "Modified Time": "01/11/2024 09:00:00" } ]
需完成两项操作:
- 将属性
Modified Time重命名为CreationTime - 按
CreationTime实现正确的时间顺序排序(直接按字符串排序不符合预期,空日期字符串转换datetime类型会报错,需将空值转为默认日期01/01/2000后再转换类型,同时保留原有其他属性、移除原Modified Time属性)
当前困惑:不知道如何在计算属性块中引用当前对象及其属性。
解决方案
使用PowerShell的Select-Object结合计算属性处理转换逻辑,基于转换后的日期类型排序,具体代码如下:
# 读取JSON文件(替换为你的文件路径) $jsonData = Get-Content -Path "your-file-path.json" | ConvertFrom-Json # 处理属性重命名、空日期转换并排序 $processedData = $jsonData | Select-Object ` Title, URL, @{ Name = 'CreationTime' Expression = { # 引用当前对象的Modified Time属性 $dateStr = $_.['Modified Time'] # 空值替换为默认日期后转换为datetime类型 if ([string]::IsNullOrEmpty($dateStr)) { [datetime]"01/01/2000" } else { [datetime]$dateStr } } } | Sort-Object -Property CreationTime # 升序排序,添加-Descending参数可改为降序 # 可选:将处理后的数据转换回JSON输出 $processedData | ConvertTo-Json -Depth 10
代码说明
$_.['Modified Time']:在计算属性的Expression块中,$_代表当前管道对象,通过索引器可直接引用带空格的属性名Modified Time- 空日期处理:用
[string]::IsNullOrEmpty判断日期字符串是否为空,为空则返回默认的datetime对象01/01/2000,否则直接转换为datetime类型 - 排序逻辑:基于转换后的
datetime类型CreationTime排序,确保时间顺序符合预期 - 属性保留:
Select-Object中显式指定Title、URL和计算生成的CreationTime,自动排除原Modified Time属性
内容的提问来源于stack exchange,提问作者Ralf_Reddings
相关产品推荐
相关产品推荐

