Что вы могли бы сделать для этого используется метод строки .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]}
бы удалить эти записи.
Для уточнения, вы хотите добавить каждый файл в массив и отсортировать по разборной метке времени? – boeprox
Есть ли что-то, что вы пробовали? Даже псевдокод лучше, чем ничего. «Myfile» когда-либо содержит символы подчеркивания? – Matt