从文件名和排序中提取时间戳

时间:2015-09-04 15:19:37

标签: sorting powershell powershell-v2.0

我正在尝试查看文件夹中的每个项目,并将每个项目添加到按文件名中的日期戳排序的数组中。

例如,我有三个文件:

  • myfile_20150813_040949.txt
  • myfile_20150812_030949.txt
  • myfile_20150812_010949.txt

我不确定如何解析每个时间并按升序将它们添加到数组中。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以为此做的是使用字符串方法.Split()[datetime]方法TryParseExact()。浏览每个文件并为" FromFileDate"添加一个属性。然后对此进行排序。

$path = "C:\temp"
Get-ChildItem -Filter "*.txt" -Path $path | ForEach-Object{
    $date = ($_.BaseName).Split("_",2)[1]
    $result = New-Object DateTime
    if([datetime]::TryParseExact($date,"yyyyMMdd_hhmmss",[System.Globalization.CultureInfo]::InvariantCulture,[System.Globalization.DateTimeStyles]::None,[ref]$result)){
        # This is a good date
        Add-Member -InputObject $_ -MemberType NoteProperty -Name "FromFileDate" -Value $result -PassThru
    } Else {
        # Could not parse date from filename
        Add-Member -InputObject $_ -MemberType NoteProperty -Name "FromFileDate" -Value "Could not Parse" -PassThru
    }
} | Select-Object Name,fromfiledate | Sort-Object fromfiledate

我们取每个文本文件的基名,并将其从第一个下划线分成两部分。使用TryParseExact,然后我们尝试转换" date"字符串格式为" yyyyMMdd_hhmmss"。由于我们在解析日期时遇到问题而使用TryParseExact,因此代码将继续。

示例输出

Name                       FromFileDate        
----                       ------------        
myfile_20150812_030949.txt 8/12/2015 3:09:49 AM
myfile_20150813_040949.txt 8/13/2015 4:09:49 AM
files.txt                  Could not Parse     

如果您不想要输出中的错误数据,则简单的Where-Object{$_.fromfiledate -is [datetime]}会删除这些条目。