我在目录中有一系列文件,格式如下:
file_ddMMyyyyhhttss.csv
例如:
myfile_151220171038.csv myfile_301120171445.csv myfile_121020161114.csv
我知道如何选择最新的LastWriteTime
:
gci "$pathtofile" | Sort LastWriteTime | Select -Last 1
但不确定如何拆分" datestamp"在文件中然后按年,月和日期排序,以确定最新文件。有什么建议吗?
答案 0 :(得分: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)
我的主张;) 只有文件,只有格式询问的文件,只有当日期确实是日期时才打印带日期的文件。
[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
答案 2 :(得分: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