如何在PowerShell中按日期对PSCustomObject进行排序?
在PowerShell中对PSCustomObject数组按日期排序后导出JSON
我创建了一个PSCustomObject来存储文件信息:
$data = [pscustomobject]@{ CatWeeklyFiles = @() }
通过循环向其中追加数据,追加逻辑如下:
# 向数据对象追加内容 $data.CatWeeklyFiles += @{ FileName = $item.ToString() Exists = 1 Date = $CatDate.ToString("MM-dd-yyyy") }
最终导出的JSON示例(当前已按日期升序,但需要手动控制升/降序):
{ "CatWeeklyFiles": [ { "Date": "04-13-2015", "FileName": "Week1615CatUpdate.exe", "Exists": 1 }, { "Date": "04-20-2015", "FileName": "Week1715CatUpdate.exe", "Exists": 1 }, { "Date": "04-27-2015", "FileName": "Week1815CatUpdate.exe", "Exists": 1 }, { "Date": "05-04-2015", "FileName": "Week1915CatUpdate.exe", "Exists": 1 } ] }
解决方案
要在导出JSON前对CatWeeklyFiles数组按日期排序,关键是将字符串格式的Date转换为DateTime类型进行排序(避免字符串排序的误差),然后重新赋值给$data.CatWeeklyFiles,再导出JSON。
排序代码实现
在导出JSON的代码前添加以下逻辑:
按日期升序排序
# 按日期升序排序:将Date字符串转为DateTime对象进行比较 $data.CatWeeklyFiles = $data.CatWeeklyFiles | Sort-Object { [DateTime]$_.Date }
按日期降序排序
只需添加-Descending参数:
# 按日期降序排序 $data.CatWeeklyFiles = $data.CatWeeklyFiles | Sort-Object { [DateTime]$_.Date } -Descending
修改后的完整代码
#### 初始化设置 $curDir = Get-Location $filename = "files.txt" $pathtocheck = "C:\path\In\Cat_Weekly" # 从files.txt创建数组 $array = Get-Content $filename ## 根据周/年获取日期的函数 Function FirstDateOfWeek { param([int]$year, [int]$weekOfYear) $jan1 = [DateTime]"$year-01-01" $daysOffset = ([DayOfWeek]::Thursday - $jan1.DayOfWeek) $firstThursday = $jan1.AddDays($daysOffset) $calendar = ([CultureInfo]::CurrentCulture).Calendar; $firstWeek = $calendar.GetWeekOfYear($firstThursday, [System.Globalization.CalendarWeekRule]::FirstFourDayWeek, [DayOfWeek]::Monday) $weekNum = $weekOfYear if($firstweek -le 1) { $weekNum -= 1 } $result = $firstThursday.AddDays($weekNum * 7) return $result.AddDays(-3) } ## 创建用于生成JSON的数据结构 $data = [pscustomobject]@{ CatWeeklyFiles = @() } # 主循环 for($i=0; $i -lt $array.Length; $i++){ $item = $array[$i] # 处理存在的Cat每周文件 if((Test-Path -Path $pathtocheck\$item -PathType Leaf) -eq $True){ write-host $i " 更新: " $item "存在" # 提取周和年份值 $extWeek = $item.Substring(4,2) $extYear = "20"+$item.Substring(6,2) # 处理年份显示为'99的bug,修正为2019 if ($extYear -eq 2099){ $extYear = 2019 } # 调用日期函数 $CatDate= FirstDateOfWeek -year $extYear -weekOfYear $extWeek # 向数据对象追加内容 $data.CatWeeklyFiles += @{ FileName = $item.ToString() Exists = 1 Date = $CatDate.ToString("MM-dd-yyyy") } } # 处理不存在的Cat每周文件 elseif((Test-Path -Path $pathtocheck\$item -PathType Leaf) -eq $False){ write-host $i " 更新: " $item "缺失!" # 提取周和年份值 $extWeek = $item.Substring(4,2) $extYear = "20"+$item.Substring(6,2) # 处理年份显示为'99的bug,修正为2019 if ($extYear -eq 2099){ $extYear = 2019 } # 调用日期函数 $CatDate= FirstDateOfWeek -year $extYear -weekOfYear $extWeek # 向数据对象追加内容 $data.CatWeeklyFiles += @{ FileName = $item.ToString() Exists = 0 Date = $CatDate.ToString("MM-dd-yyyy") } } } # 按日期排序(选择升序或降序) # 升序 $data.CatWeeklyFiles = $data.CatWeeklyFiles | Sort-Object { [DateTime]$_.Date } # 降序请替换为: # $data.CatWeeklyFiles = $data.CatWeeklyFiles | Sort-Object { [DateTime]$_.Date } -Descending # 导出为JSON文件 $json = $data | ConvertTo-Json | Out-File $curDir\tracking.json
说明
- 排序时必须将
Date字符串转换为DateTime类型,否则会按照字符串的字典序排序(比如"10-01-2023"会排在"09-30-2023"前面,因为字符串比较时"1" > "0")。 - 排序后重新赋值给
$data.CatWeeklyFiles,确保后续导出的JSON是排序后的结果。
内容的提问来源于stack exchange,提问作者alfonso2330
相关产品推荐
相关产品推荐

