2017-12-15 17 views
0

における日付スタンプに基づいて最新のファイルを決定します。私はLastWriteTimeによる最新のを選択する方法を知っている私は次の形式を持つディレクトリ内のファイルのシリーズを持っているファイル名

 
myfile_151220171038.csv 
myfile_301120171445.csv 
myfile_121020161114.csv 

 
file_ddMMyyyyhhttss.csv 

は、例えば:

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

しかし、 "datestamp"を分割して年ごとに並べ替える方法がわからない最新のファイルを特定するために、onthとdateの両方を使用します。助言がありますか?

答えて

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 

あなた1が指定しているため、あなたの正確な日付/時刻の形式に合わせて調整しますあなたの質問のファイルと一致しません。

+0

感謝を。ファイル名に逆の順序があるにもかかわらず、これが最新のバージョンを決定する論理的順序であると思ったので、私は年、月、そして日付(そして忘れた時刻)を引用しました。 – JDGEEK

+0

あなたのスクリプトを実行すると、 "3"引数を持つ "ParseExact"を呼び出す例外: "文字列によって表されるDateTimeは、Calendar System.Globalization.GregorianCalendarでサポートされている ではありません。 – JDGEEK

+0

正確な形式がファイル名に一致していないようです。サポートされているフォーマットの配列を 'ParseExact'に渡して、さまざまなバリエーションをサポートすることができます。上のコードはあなたの質問の例では機能しますが、ファイルの残りの部分がどのように見えるかわかりません。 – Joey

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コマンドレットは、定期的にだけでなく、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 

私は通常$nullを使用すると、私にいくつかのケースでの誤差を与えたので、ParseExact()のための3番目の引数としてInvariantCulture定数ではなく$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 
関連する問題