Uzyskaj pliki, których data w nazwie pliku jest większy od określonej daty, za pomocą skryptu Powershell

0

Pytanie

Mam konkretna data "2021/11/28", potrzebuję listę plików z przykładów nazw plików(poniżej), nazwa pliku których więcej 2021/11/28. nie pamiętasz czas tworzenia nazw plików.

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

Spodziewam się, że dostanę

 "abc_20211129_efg.*"
 "opq_20211130_rst.*"

Bardzo doceniam twoją pomoc.

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

Najlepsza odpowiedź

1

Nie musisz ściśle rozbierać swoje wiersze na datę ([datetime] egzemplarze): Ponieważ ciąg dat, wbudowane w nazwy plików mają format, w którym ich лексическая sortowanie równoważne chronologicznej sortowania, można bezpośrednio porównać prezentacji wierszy:

# 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.*|$)' szuka (ostatni) uruchomienie dokładnie z 8 cyfr w każdym nazwy pliku za pomocą grupy przechwytywania ((...)), odbija się w trybie automatycznym $Matches zapis zmiennej z indeksem 1 ($Matches[1]) następnie, jeśli zostanie znaleziony.

  • '2021/11/28"' -replace '/' usuwa wszystkie / znaki z ciągu wejściowego, aby zrobić format wierszy chcesz taki sam. W skrócie powyższe rozwiązanie wykonuje tę wymianę w każdej operacji cyklu. W praktyce można by wykonywali to jeden raz, przed cyklem, i przypisuje wynik do zmiennej do użytku wewnątrz pętli.

2021-11-23 20:35:51

oczywiście, zaraz to zrobię. Jakoś nie mogłem zobaczyć swój poprzedni komentarz. Ponownie komentując: "Niesamowite! Kod zadziałał jak zaklęcie. Bardzo dziękuję"
Razz

Nie mógłbyś, proszę o pomoc. Pracuję nad innym scenariuszem, który wymaga porównać to samo z dzisiejszą datą. Coś w tym stylu ... ale mam problem z formatowaniem. Where-Object {$_.Name -match '(?:^|.*\D)(\d{8})(?:\D.*|$)' -and $Matches[1] -eq (Get-Date).Date}
Razz

@Razz, zamień (Get-Date).Date z (Get-Date).ToString('yyyyMMdd'). Jeśli potrzebujesz dodatkowej pomocy, proszę utworzyć nowy post z pytaniem.
mklement0

W innych językach

Ta strona jest w innych językach

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