Dostat soubory, jejichž data v souboru je větší než nějaké konkrétní datum pomocí Powershell skriptu

0

Otázka

Mám konkrétní datum "2021/11/28", chci seznamu souborů z příkladech(viz níže), jejichž název souboru je větší než 2021/11/28. pamatujte si, není čas vytvoření souboru názvy.

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

Já jsem očekával, že si

 "abc_20211129_efg.*"
 "opq_20211130_rst.*"

Opravdu si vážím vaší pomoci.

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

Nejlepší odpověď

1

Nepotřebujete analyzovat vaše struny do data ([datetime] instance): Protože datum řetězce vložené do svého jména souborů jsou ve formátu, kde je jejich lexikální třídění odpovídá chronologické třídění, můžete porovnat řetězec reprezentace přímo:

# 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.*|$)' vypadá to na (poslední) běh přesně 8 číslic v každém názvu souboru prostřednictvím zachytit skupinu ((...)), což se odráží v automatické $Matches variabilní vstup s indexem 1 ($Matches[1]) poté, pokud nalezen.

  • '2021/11/28"' -replace '/' odstraňuje všechny / znaků ze vstupního řetězce, aby formát data řetězce stejné. Pro stručnost, řešení uvedené výše provádí toto nahrazení v každé smyčce operace. V praxi byste to provést jednou, před smyčku, a přiřadit výsledek do proměnné pro použití uvnitř smyčky.

2021-11-23 20:35:51

jistě, to udělám brzy. Nějak jsem nemohl vidět můj předchozí komentář. V komentáři opět " Úžasné! Tvůj kód funguje jako kouzlo. Díky ton"
Razz

Mohl bys pls pomozte. Pracuji na jiný skript, který vyžaduje, aby totéž porovnat s dnešním datem. Něco takového..ale já jsem stále formátování problém. Where-Object {$_.Name -match '(?:^|.*\D)(\d{8})(?:\D.*|$)' -and $Matches[1] -eq (Get-Date).Date}
Razz

@Razz, nahradit (Get-Date).Date s (Get-Date).ToString('yyyyMMdd'). Pokud budete potřebovat další pomoc, prosím, vytvořit novou otázku post.
mklement0

V jiných jazycích

Tato stránka je v jiných jazycích

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