Получите файлы, дата которых в имени файла больше определенной даты, используя скрипт Powershell

0

Вопрос

У меня есть конкретная дата "2021/11/28", мне нужен список файлов из примеров имен файлов(ниже), имя файла которых больше 2021/11/28. не помните время создания имен файлов.

 "test_20211122_aba.*"
 "abc_20211129_efg.*"
 "hij_20211112_lmn.*" 
 "opq_20211130_rst.*"

Я ожидаю, что получу

 "abc_20211129_efg.*"
 "opq_20211130_rst.*"

Очень ценю вашу помощь.

powershell powershell-4.0
2021-11-23 18:40:47
1

Лучший ответ

1

Вам не нужно строго разбирать свои строки на даты ([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 '/' удаляет все / символы из входной строки, чтобы сделать формат строк даты одинаковым. Для краткости приведенное выше решение выполняет эту замену в каждой операции цикла. На практике вы бы выполнили это один раз, перед циклом, и присвоили результат переменной для использования внутри цикла.

2021-11-23 20:35:51

конечно, я скоро это сделаю. Почему-то я не мог видеть свой предыдущий комментарий. Снова комментируя: "Потрясающе! Ваш код сработал как заклинание. Огромное спасибо"
Razz

Не могли бы вы, пожалуйста, помочь. Я работаю над другим сценарием, который требует сравнить то же самое с сегодняшней датой. Что-то вроде этого ... но у меня проблема с форматированием. Where-Object {$_.Name -match '(?:^|.*\D)(\d{8})(?:\D.*|$)' -and $Matches[1] -eq (Get-Date).Date}
Razz

@Разз, замени (Get-Date).Date с (Get-Date).ToString('yyyyMMdd'). Если вам нужна дополнительная помощь, пожалуйста, создайте новый пост с вопросом.
mklement0

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................