如何用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
相关产品推荐
相关产品推荐

