Вам не нужно строго разбирать свои строки на даты ([datetime]
экземпляры): Поскольку строки дат, встроенные в имена файлов, имеют формат, в котором их лексическая сортировка эквивалентна хронологической сортировке, вы можете напрямую сравнить представления строк:
# Simulate output from a Get-ChildItem call.
$files = [System.IO.FileInfo[]] (
"test_20211122_aba1.txt",
"abc_20211129_efg2.txt",
"hij_20211112_lmn3.txt",
"hij_20211112_lmn4.txt",
"opq_20211130_rst5.txt"
)
# Filter the array of files.
$resultFiles =
$files | Where-Object {
$_.Name -match '(?:^|.*\D)(\d{8})(?:\D.*|$)' -and
$Matches[1] -gt ('2021/11/28"' -replace '/')
}
# Print the names of the filtered files.
$resultFiles.Name
$_.Name -match '(?:^|.*\D)(\d{8})(?:\D.*|$)'
ищет (последний) запуск ровно из 8 цифр в каждом имени файла с помощью группы захвата ((...)
), отражается в автоматическом $Matches
запись переменной с индексом 1
($Matches[1]
) впоследствии, если будет найден.
'2021/11/28"' -replace '/'
удаляет все /
символы из входной строки, чтобы сделать формат строк даты одинаковым. Для краткости приведенное выше решение выполняет эту замену в каждой операции цикла. На практике вы бы выполнили это один раз, перед циклом, и присвоили результат переменной для использования внутри цикла.