Script batch "Elimina file più vecchi di"


8

Quindi, nel lavoro di backup, ho bisogno di uno script batch che mi consenta di eliminare i file in una directory specificata, che sono più vecchi di, diciamo, 3 giorni. Questo script verrà impostato come attività pianificata per l'esecuzione ogni giorno a un'ora specificata.


Sei legato al lotto? Che dire di PowerShell?
Nate,

Powershell dovrebbe essere in grado di funzionare, sono solo abituato al batch e non ho mai giocato con Powershell.
Chiggins,

Risposte:


8

Se powershell è accettabile (dovrebbe essere, in quanto abilitato per impostazione predefinita su Server 2008+), provare questo:

$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
} 

Souce qui .


2
+1. Inoltre, a scopo di test è possibile aggiungere il "-whatif" bandiera: Remove-Item $File -whatif | out-null. Per essere eseguito come attività di pianificazione, il lavoro deve specificare il percorso completo di powershell.exe con lo script denominato come argomento.
AndyN,

All'inizio ho trovato la stessa soluzione, ma ho riscontrato problemi con il carico di memoria associato all'avvio di tutti i file.
Tim Barrass,

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

Dov'è -5l'età dei file che si desidera eliminare (5 giorni o più vecchi in questo caso). Questo script sta eliminando i .rarfile: rilasciare -m *.rarse si desidera eliminare qualsiasi tipo di file.


1
Di tutte queste risposte questa è l'unica (finora) che risponde direttamente alla domanda.
John Gardeniers,

3

Se insisti nell'utilizzare file batch, Robocopy.exe è la tua risposta. È veloce (multithread) e molto robusto. Per il tuo scenario puoi utilizzare quanto segue come guida:

:: 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

C'è una lunga lista di opzioni, per favore fai robocopy /? per vederli tutti. È anche possibile utilizzarlo per eseguire backup incrementali, pianificazione, creazione di profili di backup, ecc.


Tutti i +1 per robocopy! <3 Per il tuo esempio: non sono sicuro che l'opzione / MIR sia adatta a questa situazione, / MOVE dovrebbe occuparsi della domanda di Chiggins. Una cosa è certa, robocopy ha molte opzioni, è necessario un attento esame.
JamesCW,

2

Mi piace usare DelEn.exe per questo.

Delen - DELete ENhanced - è una versione truccata di DEL. Supporta caratteri jolly estesi e directory principali, nonché filtri di data, ora e dimensioni. I file possono essere esclusi dalla cancellazione.


2

Potresti guardare DelAge32 di Horst Schaeffer:

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

Il tuo comando può essere semplice come:

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

Ho questo comando in esecuzione come attività pianificata.


Questo viene segnalato come una minaccia in Cylance.
Dom

Delage32.exe Ottiene un punteggio di 0/53 su virustotal.com, dove zero indica che non sono state rilevate minacce tra i primi 53 strumenti AV. Potresti voler cambiare il tuo AV in qualcosa di più mainstream.
RobW

Non è una mia scelta. Sto solo avvisando chiunque usi Cylance per rinunciare a delage32 o usare i forfile
dom

1

Questo è uno script PowerShell che ho scritto per fare quello che vuoi - fa anche un po 'di più. Lo uso per cancellare registri e altri file temporanei.

spurgo-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

Questo non funzionerà per i computer remoti. Gli amministratori devono gestire più computer. Di seguito è riportato lo script che può essere utilizzato per eliminare le cartelle in più computer remoti senza dover effettuare il login.

Lo script seguente eliminerà le cartelle più vecchie di 15 giorni. puoi comunque cambiare il parametro $ days.

D $ \ Programmi (x86) \ Research In Motion \ BlackBerry Enterprise Server \ Logs è il percorso UNC per la cartella Blackberry Log. È possibile modificare la directory in cui si trovano i registri / le cartelle.

Elencare tutti i nomi dei server nel file server.txt e dovrebbe trovarsi nella stessa directory di questo script.

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
}

Salvare lo script come .ps1 ed eseguirlo. Puoi programmarlo tramite file batch. In questo modo è necessario aggiungere il comando Cambia directory all'inizio dello script.

Divertiti.


0

Come approccio alternativo: invece di fare affidamento sull'interrogazione del filesystem per ottenere i tempi di creazione dei file (e colpire gli stessi file per più giorni, fino alla loro scadenza), è possibile aggiungere il file a un indice al momento della creazione. L'indice potrebbe essere potenzialmente semplice come un file che prende il nome dalla data di creazione, memorizzato in un percorso noto, con un file per riga.

Se si dispone di un'app multithread / multiprocess che crea file, è possibile che l'indice venga gestito in modo più sofisticato.

Il vantaggio sarebbe che hai sempre un elenco di file elaborato in modo relativamente semplice creato in un determinato giorno su cui puoi iterare, piuttosto che dover chiedere più e più volte al file system i dettagli.

(Ciò farebbe affidamento sull'app e sulla creazione del file, gestita da te e non da terzi).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.