none
Auflisten aller Ordner rekursiv aber Ordner haben ein bestimmtes Format RRS feed

  • Frage

  • Hallo,

    ich bin noch Anfänger was Powershell anbelangt, soviel vorweg.

    Ich habe mir mit Get-ChildItem eine Auflistung erstellt, und diese klappt auch:

    $CurrentDate = Get-Date                   # Tagesdatum
    $DatetoDelete = $CurrentDate.AddDays(-10) # Tagesdatum minus 10 Tage
    
    Get-ChildItem -Path C:\Users\Bobbie\Documents -Recurse -Directory | Where-Object {$_.CreationTime -gt $DatetoDelete}

    Nur leider bekomme ich hier nicht ganz das gewünschte Ergebnis angezeigt.

    Meine Ordner sind alle nach folgendem Format abgespeichert: yyyy_MM_dd, und genau danach wollte ich auch filtern, aber ich weiss leider nicht wie?

    Jetzt habe ich gehofft, das mir von euch einer helfen könnte!

    Danke und Grüße


    • Bearbeitet PS-Neuling Samstag, 13. Februar 2021 22:07
    Samstag, 13. Februar 2021 21:45

Antworten

  • Das funktioniert auch nur, wenn vor dem Namen nichts anderes zusätzlich steht.
    Meine Verzeichnisse heißen z.B. "2009-07-16 Urlaub auf Mallorca".
    Da wäre dann eher ein Regex interesssant:

    $DatetoDelete = (Get-Date).AddDays(-10).ToString("yyyy-MM-dd")
    Get-ChildItem -Path C:\Users\Bobbie\Documents -Recurse -Directory | 
    Foreach-Object {
        if ($_.Name -match "\d{4}-\d{2}-\d{2}") 
        {
           if ($Matches[0] -lt $DatetoDelete) 
           {
             $_
           }
        }
    }
    Statt -lt dann alternativ -le, -gt, -ge, je nach Aufgabe.


    • Bearbeitet Der Suchende Sonntag, 14. Februar 2021 12:45
    • Als Antwort markiert PS-Neuling Sonntag, 14. Februar 2021 20:59
    Sonntag, 14. Februar 2021 12:44

Alle Antworten

  • Du kannst vom Ordnernamen einen Substring machen, um den Datum-String zu extrahieren.
    https://ss64.com/ps/substring.html

    Wenn die Zeichenkette immer am Ende steht kannst du die Startposition leicht mit "$_.Name.length - 10" ermitteln.
    Mittels $DateToDelete.ToString("yyyy-MM-dd") kannst du das Datum formatieren und den Substring mit dem formatierten Datum vergleichen.

    Samstag, 13. Februar 2021 21:56
  • Moin,

    so in etwa?

    $DatetoDelete = (Get-Date).AddDays(-10)
    Get-ChildItem -Path C:\Users\Bobbie\Documents -Recurse -Directory | 
    Foreach-Object {
        $dparts = $_.Name -split '_'
        $folderDate = Get-Date -Year $dparts[0] -Month $dparts[1] -Day $dparts[2]
        if ($folderDate -gt $DatetoDelete) { $_ }
    }

    Und nur zur Sicherheit: Du willst jüngere Ordner löschen, nicht ältere?


    Evgenij Smirnov

    http://evgenij.smirnov.de


    Sonntag, 14. Februar 2021 08:04
  • Hallo Evgenij,

    erstmal vielenDank für die Rückinfo.

    Ich schaue mir dein Code dann mal an und gebe dir Rückinfo.

    Wie schon anfangs erwähnt, bin ich noch Anfänger und bin gerade dabei mir ein Powershellscript zu erstellen, das mir etwas Arbeit abnimmt.

    In meinem Netzwerk habe ich eine NAS, auf der ich wöchentlich meine Sicherung abspeichere. Mit der Zeit sammelt sich da einiges an. Da ich auch meine Emails auf der NAS sichere, möchte ich mir folgendes Script erstellen.

    Liste mir alle gesicherten Ordner (nach Format yyy_MM_dd) auf und lösche alle Ordner die älter als X tage sind. In meinem Test, habe ich mal 10 eingegeben. Da ich aber schon, an der Auflistung scheitere habe ich natürlich noch nicht mehr erstellen können. :-(

    Daher bin ich um jede Hilfe dankbar.

    Viele Grüße

    René

    Sonntag, 14. Februar 2021 12:35
  • alle Ordner die älter als X tage sind.

    Das habe ich mir gedacht ;-) Und "älter"  bedeutet "(Datum des Ordners) -lt (Löschvorgabe)" und nicht -gt, daher die Rückfrage.


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Sonntag, 14. Februar 2021 12:41
  • Das funktioniert auch nur, wenn vor dem Namen nichts anderes zusätzlich steht.
    Meine Verzeichnisse heißen z.B. "2009-07-16 Urlaub auf Mallorca".
    Da wäre dann eher ein Regex interesssant:

    $DatetoDelete = (Get-Date).AddDays(-10).ToString("yyyy-MM-dd")
    Get-ChildItem -Path C:\Users\Bobbie\Documents -Recurse -Directory | 
    Foreach-Object {
        if ($_.Name -match "\d{4}-\d{2}-\d{2}") 
        {
           if ($Matches[0] -lt $DatetoDelete) 
           {
             $_
           }
        }
    }
    Statt -lt dann alternativ -le, -gt, -ge, je nach Aufgabe.


    • Bearbeitet Der Suchende Sonntag, 14. Februar 2021 12:45
    • Als Antwort markiert PS-Neuling Sonntag, 14. Februar 2021 20:59
    Sonntag, 14. Februar 2021 12:44
  • Das funktioniert auch nur, wenn vor dem Namen nichts anderes zusätzlich steht.
    Meine Verzeichnisse heißen z.B. "2009-07-16 Urlaub auf Mallorca".
    Da wäre dann eher ein Regex interesssant:

    $DatetoDelete = (Get-Date).AddDays(-10).ToString("yyyy-MM-dd")
    Get-ChildItem -Path C:\Users\Bobbie\Documents -Recurse -Directory | 
    Foreach-Object {
        if ($_.Name -match "\d{4}-\d{2}-\d{2}") 
        {
           if ($Matches[0] -lt $DatetoDelete) 
           {
             $_
           }
        }
    }
    Statt -lt dann alternativ -le, -gt, -ge, je nach Aufgabe.


    Viiiiiiiiiiiiiiielen Dank. :-)
    Sonntag, 14. Februar 2021 21:00