You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:20:43