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

如何用PowerShell按日期排序合并多文件解析后的内容?

问题说明

我通过程序导出了一万余个单个文本文件,存储在指定文件夹中。已编写PowerShell脚本可从这些文件中解析所需数据并合并为单个文件,但无法实现按文件中第9行的日期值(格式为Date: Mon, 27 Jun 2022 18:14:53 GMT)进行排序。以下是脚本执行后的示例输出及现有PowerShell脚本,恳请提供技术帮助:

示例输出

Filename: C:\temp\application\006ff9c0-f614-11ec-8f02-11e98e66244e.txt  
From: Test.user@domain.com  
Date: Mon, 27 Jun 2022 12:23:50 GMT  
This is sample message data from the export


Filename: C:\temp\application\00d086e0-cd70-11ec-98d5-6bd60cef152f.txt.txt
From: test.user@domain.com
Date: Fri, 06 May 2022 19:09:07 GMT
This is another sample of message data

现有PowerShell脚本

clear-host
$MessagesFolder = 'C:\temp'
$MessageSearchLength = 10000
$fileText = @()

$Files = Get-ChildItem -Path $MessagesFolder -File | Select-Object -ExpandProperty FullName

Foreach( $File in $Files ) {
  $fileText += "Filename: " + $File
  $fileText += (Select-String -Path $File -Pattern "From:").Line
  $fileText += (Select-String -Path $File -Pattern "Date:").Line
  $message = Select-String -Path $File -Pattern "MIME-Version:" -Context 0, $MessageSearchLength


  Foreach($postLine in $message.Context.DisplayPostContext) {
    if ($postLine) {
      $fileText += $postLine
    }
  }
  $fileText += ""
} 

Out-File -FilePath 'C:\temp\test.txt' -InputObject $fileText 

解决方案

要实现按日期排序,需先从每个文件中提取可用于排序的标准DateTime对象,再基于该对象排序后生成最终输出。修改后的脚本如下:

clear-host
$MessagesFolder = 'C:\temp'
$MessageSearchLength = 10000
$messageEntries = @()

$Files = Get-ChildItem -Path $MessagesFolder -File | Select-Object -ExpandProperty FullName

foreach( $File in $Files ) {
    # 提取Date行并转换为DateTime对象
    $dateLine = (Select-String -Path $File -Pattern "Date:").Line
    $dateValue = [DateTime]::ParseExact(
        $dateLine.Replace('Date: ', ''),
        'ddd, dd MMM yyyy HH:mm:ss GMT',
        [System.Globalization.CultureInfo]::InvariantCulture
    )
    
    # 构建当前文件的输出内容块
    $entryContent = @()
    $entryContent += "Filename: " + $File
    $entryContent += (Select-String -Path $File -Pattern "From:").Line
    $entryContent += $dateLine
    $message = Select-String -Path $File -Pattern "MIME-Version:" -Context 0, $MessageSearchLength
    
    foreach($postLine in $message.Context.DisplayPostContext) {
        if ($postLine) {
            $entryContent += $postLine
        }
    }
    $entryContent += ""
    
    # 存储日期和对应内容块
    $messageEntries += [PSCustomObject]@{
        SortDate = $dateValue
        Content = $entryContent -join "`r`n"
    }
} 

# 按日期排序后导出
$sortedContent = $messageEntries | Sort-Object SortDate | Select-Object -ExpandProperty Content
$sortedContent | Out-File -FilePath 'C:\temp\test_sorted.txt' -Encoding utf8

关键修改点

  • 用$messageEntries数组存储每个文件的排序日期和完整内容块,避免直接拼接字符串,便于后续排序操作
  • 使用[DateTime]::ParseExact将Date:行的文本转换为标准DateTime对象,确保排序逻辑准确(格式字符串需与日期格式严格匹配)
  • 先对所有条目按SortDate排序,再提取内容合并输出
  • 输出时指定-Encoding utf8,避免出现乱码问题

内容的提问来源于stack exchange,提问作者isaac bishop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:54:28