如何在PowerShell中对含日期的文本文件进行排序?
问题描述
我是PowerShell新手,手里有个包含文件列表(带修改日期)的HTML格式文本文件,想在PowerShell里对这些文件按修改日期排序,但试了下面两个命令都没效果:
Get-Content -Path C:\toBeDeleted\Output.txt |Sort-Object LastWriteTime -Descending Get-Content -Path C:\toBeDeleted\Output.txt |Sort-Object { [int] $_ }
文本文件内容如下:
<!DOCTYPE html> <html> <head><meta name="robots" content="noindex" /> <title>Index of pme-modernization/ModuleBuilder/develop</title> </head> <body> <h1>Index of pme-modernization/ModuleBuilder/develop</h1> <pre>Name Last modified Size</pre><hr/> <pre><a href="../">../</a> <a href="jenkins-ModuleBuilder-develop-100_BuildOutput.zip">jenkins-ModuleBuilder-develop-100_BuildOutput.zip</a> 05-Jul-2023 10:28 16.76 MB <a href="jenkins-ModuleBuilder-develop-100_BuildOutput.zip_BuildInfo.txt">jenkins-ModuleBuilder-develop-100_BuildOutput.zip_BuildInfo.txt</a> 05-Jul-2023 10:28 758 bytes <a href="jenkins-ModuleBuilder-develop-101_BuildOutput.zip">jenkins-ModuleBuilder-develop-101_BuildOutput.zip</a> 07-Jul-2023 04:49 16.76 MB <a href="jenkins-ModuleBuilder-develop-101_BuildOutput.zip_BuildInfo.txt">jenkins-ModuleBuilder-develop-101_BuildOutput.zip_BuildInfo.txt</a> 07-Jul-2023 04:49 758 bytes <a href="jenkins-ModuleBuilder-develop-102_BuildOutput.zip">jenkins-ModuleBuilder-develop-102_BuildOutput.zip</a> 10-Jul-2023 08:49 18.30 MB <a href="jenkins-ModuleBuilder-develop-102_BuildOutput.zip_BuildInfo.txt">jenkins-ModuleBuilder-develop-102_BuildOutput.zip_BuildInfo.txt</a> 10-Jul-2023 08:49 758 bytes <a href="jenkins-ModuleBuilder-develop-103_BuildOutput.zip">jenkins-ModuleBuilder-develop-103_BuildOutput.zip</a> 17-Jul-2023 06:44 18.30 MB <a href="jenkins-ModuleBuilder-develop-103_BuildOutput.zip_BuildInfo.txt">jenkins-ModuleBuilder-develop-103_BuildOutput.zip_BuildInfo.txt</a> 17-Jul-2023 06:45 758 bytes <a href="jenkins-ModuleBuilder-develop-104_BuildOutput.zip">jenkins-ModuleBuilder-develop-104_BuildOutput.zip</a> 20-Jul-2023 16:22 18.31 MB <a href="jenkins-ModuleBuilder-develop-104_BuildOutput.zip_BuildInfo.txt">jenkins-ModuleBuilder-develop-104_BuildOutput.zip_BuildInfo.txt</a> 20-Jul-2023 16:22 758 bytes <a href="jenkins-ModuleBuilder-develop-105_BuildOutput.zip">jenkins-ModuleBuilder-develop-105_BuildOutput.zip</a> 24-Jul-2023 12:02 18.31 MB <a href="jenkins-ModuleBuilder-develop-105_BuildOutput.zip_BuildInfo.txt">jenkins-ModuleBuilder-develop-105_BuildOutput.zip_BuildInfo.txt</a> 24-Jul-2023 12:03 758 bytes <a href="jenkins-ModuleBuilder-develop-106_BuildOutput.zip">jenkins-ModuleBuilder-develop-106_BuildOutput.zip</a> 24-Jul-2023 13:53 18.31 MB <a href="jenkins-ModuleBuilder-develop-106_BuildOutput.zip_BuildInfo.txt">jenkins-ModuleBuilder-develop-106_BuildOutput.zip_BuildInfo.txt</a> 24-Jul-2023 13:54 758 bytes <a href="jenkins-ModuleBuilder-develop-107_BuildOutput.zip">jenkins-ModuleBuilder-develop-107_BuildOutput.zip</a> 25-Jul-2023 06:30 18.31 MB <a href="jenkins-ModuleBuilder-develop-107_BuildOutput.zip_BuildInfo.txt">jenkins-ModuleBuilder-develop-107_BuildOutput.zip_BuildInfo.txt</a> 25-Jul-2023 06:30 758 bytes <a href="jenkins-ModuleBuilder-develop-108_BuildOutput.zip">jenkins-ModuleBuilder-develop-108_BuildOutput.zip</a> 26-Jul-2023 13:42 20.59 MB <a href="jenkins-ModuleBuilder-develop-108_BuildOutput.zip_BuildInfo.txt">jenkins-ModuleBuilder-develop-108_BuildOutput.zip_BuildInfo.txt</a> 26-Jul-2023 13:42 758 bytes <a href="jenkins-ModuleBuilder-develop-109_BuildOutput.zip">jenkins-ModuleBuilder-develop-109_BuildOutput.zip</a> 27-Jul-2023 09:29 20.59 MB </pre> </body> </html>
解决方案
之前的命令无效原因很明确:
Sort-Object LastWriteTime:Get-Content输出的是纯文本行,这些行没有LastWriteTime属性,参数完全不生效。Sort-Object { [int] $_ }:尝试把整行转成整数,但每行是带HTML标签和日期的字符串,根本无法转换,排序逻辑错误。
要实现按修改日期排序,需要先提取有效行的文件信息,把日期转换成可排序的DateTime对象,再执行排序,最后输出结果。
完整PowerShell脚本如下:
# 读取文件内容,过滤出包含实际文件链接和日期的有效行 $lines = Get-Content -Path C:\toBeDeleted\Output.txt | Where-Object { $_ -match '<a href="[^./].*?"' -and $_ -match '\d{2}-[A-Za-z]{3}-\d{4} \d{2}:\d{2}' } # 处理每一行,提取关键信息并转为可排序对象 $fileObjects = $lines | ForEach-Object { # 从HTML标签中提取文件名 $fileName = [regex]::Match($_, '>([^<]+)</a>').Groups[1].Value.Trim() # 提取日期字符串并转为DateTime对象 $dateStr = [regex]::Match($_, '\d{2}-[A-Za-z]{3}-\d{4} \d{2}:\d{2}').Value $lastWriteTime = [DateTime]::ParseExact($dateStr, 'dd-MMM-yyyy HH:mm', $null) # 返回包含原行和关键信息的自定义对象 [PSCustomObject]@{ FileName = $fileName LastWriteTime = $lastWriteTime OriginalLine = $_ } } # 按修改日期降序排序(最新文件在前) $sortedFiles = $fileObjects | Sort-Object LastWriteTime -Descending # 输出排序后的原HTML格式行 $sortedFiles.OriginalLine # 若需要更清晰的表格格式,可替换为下面的命令: # $sortedFiles | Select-Object FileName, LastWriteTime | Format-Table -AutoSize
脚本说明
- 过滤有效行:跳过HTML结构行、标题行和
../目录行,只保留带实际文件链接和日期的行。 - 转换日期格式:用正则提取日期字符串,转为
DateTime对象——只有转为日期类型,才能按时间逻辑正确排序。 - 排序与输出:按修改日期降序排序后,可选择输出原HTML格式的行,或者输出整理后的表格格式。
内容的提问来源于stack exchange,提问作者Priyanka Gokave
相关产品推荐
相关产品推荐

