根据文件名中的时间戳确定最新文件

问题描述 投票:0回答:3

我在目录中有一系列文件,格式如下:

file_ddMMyyyyhhttss.csv

例如:

myfile_151220171038.csv
myfile_301120171445.csv
myfile_121020161114.csv

我知道如何选择最新的LastWriteTime

gci "$pathtofile" | Sort LastWriteTime | Select -Last 1

但不确定如何拆分文件中的“时间戳”,然后按年,月和日期排序,以确定最新文件。有什么建议?

powershell date
3个回答
4
投票

好吧,文件名中的特定格式可以防止任何有用的排序而不解析它,但你可以这样做:

Get-ChildItem $pathtofile |
  ForEach-Object {
    # isolate the timestamp
    $time = $_ -replace '.*(\d{12}).*','$1'
    # parse
    $timestamp = [DateTime]::ParseExact($time, 'ddMMyyyyHHmm', $null)
    # add to the objects so we can sort
    $_ | Add-Member -PassThru NoteProperty Timestamp $timestamp
  } |
  Sort-Object Timestamp

调整以适合您的确切日期/时间格式,因为您在问题中指定的格式与文件中的格式不匹配。


0
投票

我的主张;)只有文件,只有格式询问的文件,只有日期是真正的日期打印文件。

 [System.DateTime]$parsedDate=get-date

 Get-ChildItem "c:\temp\" -file -filter "*.csv" | where BaseName -match ".*(\d{12}).*" | %{

   $DtString=$_.BaseName.substring($_.BaseName.Length - 12)

   if ([DateTime]::TryParseExact($DtString, "ddMMyyyyhhmm",$null,[System.Globalization.DateTimeStyles]::None,[ref]$parseddate))
   {
       $_ | Add-Member -Name TimeInName -Value $parseddate -MemberType NoteProperty -PassThru
   }

 } | Sort TimeInName -Descending | Select -First 1

0
投票

Sort-Object cmdlet不仅可以使用常规功能,还可以使用calculated properties。这允许您对文件进行排序,而不是首先通过ForEach-Object循环。像这样:

$pattern = '.*_(\d{14}).*'
$datefmt = 'ddMMyyyyHHmmss'
$culture = [Globalization.CultureInfo]::InvariantCulture

Get-ChildItem $pathtofile | Sort-Object @{n='Timestamp';e={
    $datestr = $_.Basename -replace $pattern, '$1'
    [DateTime]::ParseExact($datestr, $datefmt, $culture)
}} | Select-Object -Last 1

我通常建议使用InvariantCulture常量而不是$null作为ParseExact()的第三个参数,因为在某些情况下使用$null给了我错误。

如果您的源目录包含与您的文件名模式不匹配的文件,您可能希望在排序其余文件之前使用Where-Object过滤器将它们排除:

Get-ChildItem $pathtofile | Where-Object {
    $_.Basename -match $pattern
} | Sort-Object @{n='Timestamp';e={
    $datestr = $_.Basename -replace $pattern, '$1'
    [DateTime]::ParseExact($datestr, $datefmt, $culture)
}} | Select-Object -Last 1
© www.soinside.com 2019 - 2024. All rights reserved.