none
Dateien löschen, wenn mehr als x vorhanden RRS feed

  • Frage

  • Hallo zusammen,

    ich bin absoluter Frischling im Thema Powershell und allgemein programmieren.

    Ich habe von unserem Admin eine "kleine Aufgabe" erhalten, an welcher ich in teilen aber scheitere.

    Folgendes Szenario:

    Momentan erhalten wir jede Nacht von unseren Telefonanlagen ein Backup auf unseren FTP Server. Diese Sicherungen werden momentan jeden morgen per XCopy aus diesem Ordner in einen Saveordner verschoben. Hierfür habe ich die Powershell Syntax (nennt man das so?"") fertig aber noch nicht im Einsatz.

    Jetzt kommen wir zu dem Punkt, welchen ich nicht gelöst bekomme:

    Der Saveordner wird täglich per XCopy bereinigt. Hierzu wird jede Datei im Saveordner, welche älter als 30 Tage ist gelöscht. Dies wollen wir ändern, da wir im schlechtesten Fall ohne Datensicherung dastehen. Dies wäre der Fall wenn per FTP keine Daten mehr reinkommen, wir aber munter weiter alle Daten löschen, welche älter als 30 Tage sind. Besteht die Möglichkeit, dass wir statt älter X zu löschen hergehen und in jedem Ordner immer die 10 aktuellsten Sicherungen vorhalten und wenn dann die 11 reinkommt die älteste gelöscht wird?

    Würde mich echt freuen, wenn man dies irgendwie geregelt bekommt.

    Mit freundlichen Grüßen und einem Dank im Voraus

    Sebastian

    Donnerstag, 12. November 2020 10:25

Antworten

  • Sinngemäß:

    Get-ChildItem | Sort -Descending -Property LastWrite | Select -Skip 10 | Remove-Item


    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Donnerstag, 12. November 2020 11:30
  • Get-Childitem erlaubt auch gezielt eine Path-Angabe.
    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7.1

    Du kannst das in eine Schleife für jedes Verzeichnis aufrufen. Mit einem Befehl klappt das nicht, da der Filter "-skip 10" auf das Gesamtergebnis einer rekursiven Suche zielen würde.

    Du kannst auch mittels "get-childitem -path ..." das Ganze für jedes Verzeichnis explizit aufrufen.


    Donnerstag, 12. November 2020 14:47

Alle Antworten

  • Ohne ein paar Vorkenntnisse wirds schwierig.

    Du kannst dir die Dokumente per Get-Item in ein Array laden. Dieses sortierst du nach Erstelldatum.
    Anschließend löscht du die Dokumente einzeln bis nur noch 10 übrig sind.

    Donnerstag, 12. November 2020 10:29
  • Sinngemäß:

    Get-ChildItem | Sort -Descending -Property LastWrite | Select -Skip 10 | Remove-Item


    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Donnerstag, 12. November 2020 11:30
  • Sinngemäß:

    Get-ChildItem | Sort -Descending -Property LastWrite | Select -Skip 10 | Remove-Item

    ...und beim Ausprobieren bitte aufpassen, in welchem Verzeichnis man sich gerade befindet! PowerShell mit Adminrechten startet gern in C:\Windows\system32, das wird dann schnell richtig spannend ;-)

    Evgenij Smirnov

    http://evgenij.smirnov.de

    Donnerstag, 12. November 2020 11:37
  • ...und beim Ausprobieren bitte aufpassen, in welchem Verzeichnis man sich gerade befindet! PowerShell mit Adminrechten startet gern in C:\Windows\system32, das wird dann schnell richtig spannend ;-)

    Ein wenig Spannung kann in diesen diesigen Tagen nicht schaden (-; Spaß beiseite: Ich arbeite da gern mit

    $whatifpreference=$true

    Dann wird's nicht ganz so schlimm, wenn man mal das falsche Verzeichnis erwischt.


    Greetings/Grüße, Martin - https://mvp.microsoft.com/en-us/PublicProfile/5000017 Mal ein gutes Buch über GPOs lesen? - http://www.amazon.de/Windows-Server-2012--8-Gruppenrichtlinien/dp/3866456956 Good or bad GPOs? My blog - http://evilgpo.blogspot.com And if IT bothers me? Coke bottle design refreshment - http://sdrv.ms/14t35cq

    Donnerstag, 12. November 2020 12:40
  • Hallo zusammen,

    Danke für die mega schnelle Hilfe!

    Mit Get-ChildItem | Sort -Descending -Property LastWriteTime | Select -Skip 10 | Remove-Item klappt es soweit.

    Nun muss ich das ganze noch erweitern. Im Saveordner liegen wieder mehrere Unterverzeichnisse mit den entsprechenden Backups darin. Wenn ich das oben stehende im Saveordner ausführe, werden ja wahrscheinlich alle Ordner außer der 10 aktuellsten gelöscht, was natürlich wieder mehr als schlecht ist.

    Besteht die Möglichkeit, den Befehl so zu erweitern, dass in jeden einzelnen Ordner geschaut wird und das Löschen dann entsprechend ausgeführt wird?

    MfG Sebastian

    Donnerstag, 12. November 2020 14:12
  • Get-Childitem erlaubt auch gezielt eine Path-Angabe.
    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7.1

    Du kannst das in eine Schleife für jedes Verzeichnis aufrufen. Mit einem Befehl klappt das nicht, da der Filter "-skip 10" auf das Gesamtergebnis einer rekursiven Suche zielen würde.

    Du kannst auch mittels "get-childitem -path ..." das Ganze für jedes Verzeichnis explizit aufrufen.


    Donnerstag, 12. November 2020 14:47
  • Get-Childitem erlaubt auch gezielt eine Path-Angabe.
    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7.1

    Du kannst das in eine Schleife für jedes Verzeichnis aufrufen. Mit einem Befehl klappt das nicht, da der Filter "-skip 10" auf das Gesamtergebnis einer rekursiven Suche zielen würde.

    Du kannst auch mittels "get-childitem -path ..." das Ganze für jedes Verzeichnis explizit aufrufen.


    OK, das habe ich soweit verstanden. Mit welcher Art Schleife liese sich dies umsetzen? Möchte versuchen mir das passende zusammenzubauen.
    Donnerstag, 12. November 2020 15:14
  • get-childitem -path "..." -directory | foreach ...
    Donnerstag, 12. November 2020 15:38
  • Sebastian,

    es ist nicht möglich (und auch nicht gewollt), Dir hier im Forum iterativ das Scripten beizubringen. Du wirst Dir also bitte die Grundlagen von Powershell erstmal selbst aneignen müssen. Es gibt dazu zahllose - auch kostenfreie - Quellen im Internet.

    Vielleicht schaust Du mal hier vorbei:

    Getting Started with PowerShell 3.0

    Windows PowerShell™ 4: TFM

    Keine Angst, wenn es da um "alte" Versionen von Powershell geht - die Grundlagen sind immernoch die gleichen. ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 12. November 2020 15:40
  • Vielleicht erst mal ein paar Grundlagen?

    https://entwickler.de/online/development/einfuehrung-programmierung-grundlagen-teil-1-197189.html

    Donnerstag, 12. November 2020 16:03