Batch-Skript "Dateien löschen, die älter als" sind


8

Für die Durchführung von Sicherungen benötige ich ein Batch-Skript, mit dem ich Dateien in einem bestimmten Verzeichnis löschen kann, die älter sind als beispielsweise 3 Tage. Dieses Skript wird als geplante Aufgabe festgelegt, die jeden Tag zu einer bestimmten Zeit ausgeführt wird.


Sind Sie an Batch gebunden? Was ist mit Powershell?
Nate

Powershell sollte funktionieren können, ich bin nur an Batch gewöhnt und habe noch nie mit Powershell gespielt.
Chiggins

Antworten:


8

Wenn Powershell akzeptabel ist (sollte es sein, da es auf Server 2008+ standardmäßig aktiviert ist), versuchen Sie Folgendes:

$numberOfDays = 3
$Now = Get-Date
$TargetFolder = “C:\myoldfiles”
$LastWrite = $Now.AddDays(-$numberOfDays)
$Files = get-childitem $TargetFolder -include *.bak, *.x86 -recurse | Where {$_.LastWriteTime -le “$LastWrite”} 

foreach ($File in $Files)
{
    write-host “Deleting File $File” -foregroundcolor “Red”;
    Remove-Item $File | out-null
} 

Quelle hier .


2
+1. Zu Testzwecken können Sie außerdem das Flag "-whatif" hinzufügen : Remove-Item $File -whatif | out-null. Um als Schedule-Task ausgeführt zu werden, sollte der Job den vollständigen Pfad zu Powershell.exe mit Ihrem Skript als Argument angeben.
AndyN

Ich hatte zunächst die gleiche Lösung - aber ich hatte Probleme mit der Speicherauslastung, die damit verbunden war, alle Dateien im Voraus zu erhalten.
Tim Barrass

13
forfiles -pc: \ pathtofiles \ -m * .rar -d -5 -c "cmd / c del @path"

Wo -5ist das Alter der Dateien, die Sie löschen möchten (in diesem Fall 5 Tage oder älter)? Dieses Skript löscht .rarDateien. Löschen -m *.rarSie das, wenn Sie einen Dateityp löschen möchten.


1
Von all diesen Antworten ist dies (bisher) die einzige, die die Frage direkt beantwortet.
John Gardeniers

3

Wenn Sie darauf bestehen, Batch-Dateien zu verwenden, ist Robocopy.exe Ihre Antwort. Es ist schnell (Multithread) und sehr robust. Für Ihr Szenario können Sie Folgendes als Leitfaden verwenden:

:: Moves dir & files older than 3 days to i:\Destination
:: Wildcards acceptable
robocopy i:\Source\ i:\Destination\ /MOVE /MIR /MINAGE:3 /ETA
:: Removes the destination tree
rd /s /q i:\destination

Es gibt eine lange Liste von Optionen, bitte Robocopy /? um sie alle zu sehen. Sie können es sogar verwenden, um inkrementelle Sicherungen durchzuführen, zu planen, Sicherungsprofile zu erstellen usw.


Alle +1 für Robocopy! <3 Zu Ihrem Beispiel: Ich bin nicht sicher, ob der Schalter / MIR für diese Situation geeignet ist. Der Schalter / MOVE sollte sich um Chiggins 'Frage kümmern. Eines ist sicher, Robocopy hat eine Menge Optionen, sorgfältige Prüfung ist erforderlich.
JamesCW

2

Ich benutze dafür gerne DelEn.exe .

Delen - DELete ENhanced - ist eine aufgemotzte Version von DEL. Es unterstützt erweiterte Platzhalter und übergeordnete Verzeichnisse sowie Filter für Datum, Uhrzeit und Größe. Dateien können vom Löschen ausgeschlossen werden.


2

Sie könnten sich Horst Schaeffers DelAge32 ansehen:

http://home.mnet-online.de/horst.muc/wbat32.htm#top

DelAge32 - ver. 2.3 (c) 2003-2008, Horst Schaeffer
Deletes or moves files (path with file pattern) by age (number of days)
Syntax:  DelAge32 filespec age [options]
Options:
  /created /accessed /modified (default) - file stamp used to evaluate age
  /includeRO - include read-only files
  /includeH  - include hidden files
  /includeS  - include system files
  /includeRHS -include read-only, hidden and system files
  /recurse   - include subdirectories
  /subonly   - /recurse excluding initial directory
  /rd        - remove empty subdirectories
  /move path - move files to specified path
  /preview   - list, but no action
  /quiet     - no output

Ihr Befehl kann so einfach sein wie:

delage32.exe c:\logdirectory\*.log 3

Ich habe diesen Befehl als geplante Aufgabe ausgeführt.


Dies wird in Cylance als Bedrohung gekennzeichnet.
So

Delage32.exe Erhält bei virustotal.com eine Bewertung von 0/53, wobei Null bedeutet, dass unter den 53 besten AV-Tools keine Bedrohungen erkannt wurden. Möglicherweise möchten Sie Ihre AV auf etwas mehr Mainstream ändern.
RobW

Es ist nicht meine Wahl. Ich warne nur für jeden, der Cylance verwendet, um entweder auf delage32 zu verzichten oder forfiles zu verwenden
So

1

Dies ist ein Powershell-Skript, das ich geschrieben habe, um das zu tun, was Sie wollen - es macht auch ein bisschen mehr. Ich benutze es, um Protokolle und andere temporäre Dateien zu löschen.

purge-dem-logs.cmd

powershell.exe -command "& 'c:\purgelogs\purgelogs.ps1' -Filepath D:\SQL\backup\ -filemask *.bak -Maxdays 14 "

purgelogs.ps1:

Param ($filepath, $filemask, $maxdays, [switch]$recurse)

   if (($FilePath -eq $null) -or ($FileMask -eq $null) -or ($MaxDays -eq $null)) {
      write-host "Usage .\purgelogs.ps1 -filepath [Path] -filemask [Mask] -masdays [Max Days]"
      write-host " "
      write-host "Example: "
      write-host "    .\purgelogs.ps1 -filepath c:\temp -filemask *.log -maxdays 30"
      break
      }

   if (Test-Path $FilePath) {

      $FilePath += "*"

      $Now = Get-Date

      $LastWrite = $Now.AddDays(-$MaxDays)

      write-host "Last write time " $LastWrite
      if ($recurse) {
         $Files = get-childitem $FilePath -include $FileMask -recurse | Where {$_.LastWriteTime -le "$LastWrite"}
      } else {
         $Files = get-childitem $FilePath -include $FileMask | Where {$_.LastWriteTime -le "$LastWrite"}
      }

      if ($Files -eq $null) {

         write-host "No matching files found"

      } else {

          foreach ($File in $Files)
            #You can add -whatif to see the consequence û Remove-item $File -Whatif
            {
            write-host "Deleting File $File" -foregroundcolor "Red"; Remove-Item $File | out-null
            }
         }
      }
   Else
      {
      Write-Host "The Folder $FilePath Does Not Exist!"
      }

1

Dies funktioniert nicht für Remotecomputer. Administratoren müssen mehrere Computer verwalten. Im Folgenden finden Sie das Skript, mit dem Sie Ordner auf mehreren Remotecomputern löschen können, ohne sich bei ihnen anmelden zu müssen.

Das folgende Skript löscht Ordner, die älter als 15 Tage sind. Sie können den Parameter $ days jedoch ändern.

D $ \ Programme (x86) \ Research In Motion \ BlackBerry Enterprise Server \ Logs ist der UNC-Pfad für den Blackberry Log-Ordner. Sie können das Verzeichnis ändern, in dem sich Ihre Protokolle / Ordner befinden.

Listen Sie alle Ihre Servernamen in der Datei servers.txt auf, die sich im selben Verzeichnis wie dieses Skript befinden sollte.

cd C:\Scripts\Powershellscripts\deletefiles ----> change it to the directory you wanna out this script to

$Days = "15" 
$Now = Get-Date
$LastWrite = $Now.AddDays(-$days)
$server = get-content servers.txt
foreach ($node in $server)
{
get-childitem -recurse "\\$node\D$\Program Files (x86)\Research In Motion\BlackBerry Enterprise Server\Logs" | Where-Object {$_.LastWriteTime -le $LastWrite} | remove-item -recurse -force
}

Speichern Sie das Skript als .ps1 und führen Sie es aus. Sie können es über eine Batch-Datei planen. Auf diese Weise müssen Sie am Anfang des Skripts den Befehl Verzeichnis ändern hinzufügen.

Habe Spaß.


0

Als alternativer Ansatz: Anstatt sich darauf zu verlassen, das Dateisystem abzufragen, um die Erstellungszeiten für Dateien zu ermitteln (und dieselben Dateien über mehrere Tage hinweg zu erfassen, bis sie ablaufen), können Sie die Datei zum Zeitpunkt der Erstellung einem eigenen Index hinzufügen. Der Index kann möglicherweise so einfach sein wie eine Datei, die nach dem Erstellungsdatum benannt ist und an einem bekannten Speicherort mit einer Datei pro Zeile gespeichert ist.

Wenn Sie eine Multithread- / Multiprozess-App haben, die Dateien erstellt, möchten Sie möglicherweise, dass Ihr Index komplexer behandelt wird.

Der Vorteil wäre, dass Sie immer eine relativ einfach verarbeitete Liste von Dateien haben, die an einem bestimmten Tag erstellt wurden und über die Sie iterieren können, anstatt das Dateisystem immer wieder nach Details fragen zu müssen.

(Dies würde davon abhängen, dass die App und die Dateierstellung von Ihnen und nicht von Dritten verwaltet werden.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.