从文件名中解析出日期并按日期排序

时间:2018-01-30 20:05:24

标签: powershell

我在文件夹中有一系列文件名称:   - myFile201801010703.file

我正在尝试解析文件夹中每个文件名的yyyymmdd部分,并根据日期对数组进行排序。

所以,如果我有以下文件:

  • myFile201801200000.file(01/20/2018)
  • myFile201800100000.file(01/01/2018)
  • myFile201801100000.file(01/10/2018)

它会将它们分类为一个数组:

  • myFile201800100000.file(01/01/2018)
  • myFile201801100000.file(01/10/2018)
  • myFile201801200000.file(01/20/2018)

我有一个适用于名称中包含时间戳的文件的进程,但是因为只有日期的工作而无法调整它:

    # RegEx pattern to parse the timestamps
    $Pattern = '(\d{4})(\d{2})(\d{2})*\' + ".fileExtension"
    $FilesList = New-Object System.Collections.ArrayList
    $Temp = New-Object System.Collections.ArrayList
    Get-ChildItem $SourceFolder | ForEach {
        if ($_.Name -match $Pattern) {
            Write-Verbose "Add $($_.Name)" -Verbose
            $Date = $Matches[2],$Matches[3],$Matches[1] -join '/'
            $Time = $Matches[4..6] -join ':'
            [void]$Temp.Add(
                (New-Object PSObject -Property @{
                    Date = [datetime]"$($Date) $($Time)" #If I comment out $($Time)it doesn't work.
                    File = $_
                }
            ))
        }
    }
} catch {
    Write-Host "`n*** $Error ***`n"
}

# Sort the files by the parsed timestamp and add to $FilesList
$FilesList.AddRange(@($Temp | Sort Date | Select -Expand File))

# Clear out the temp collection
$Temp.Clear()

我认为可能是罪魁祸首的两条线是:

$Time = $Matches[4..6] -join ':'因为我没有随时解析

Date = [datetime]"$($Date) $($Time)"同样,没有时间被解析。似乎无法将类型更改为日期?

1 个答案:

答案 0 :(得分:7)

使用以下格式:

myFileYYYYMMddHHmm.file

日期和时间的各个部分已经从最大(年)到最小(分钟)排列 - 这使得字符串可以排序!

我们唯一需要做的就是在扩展名之前抓取文件名的最后12位数字:

$SortedArray = Get-ChildItem *.file |Sort-Object {$_.BaseName -replace '^.*(\d{12})$','$1'}

使用正则表达式:

^.*(\d{12})$

可细分如下:

^              # start of string
  .*           # any character, 0 or more times
    (          # capture group
     \d{12}    # any digit, 12 times
           )   # end of capture group
            $  # end of string

正则表达式引擎会将替换字符串中的$1扩展为“捕获组#1”,即。我们最后收到的12位数字。