Script por lotes "Eliminar archivos anteriores a"

8

Entonces, en el trabajo de hacer copias de seguridad, necesito un script por lotes que me permita eliminar archivos en un directorio específico, que son más antiguos que digamos, 3 días. Este script se configurará como una tarea programada para ejecutarse a una hora específica todos los días.

Chiggins
fuente
¿Estás atado al lote? ¿Qué pasa con PowerShell?
Nate
Powershell debería poder funcionar, solo estoy acostumbrado a lotes y nunca he jugado con Powershell.
Chiggins

Respuestas:

8

Si powershell es aceptable (debería estarlo, ya que está habilitado de forma predeterminada en Server 2008+) intente esto:

$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 aquí .

Nate
fuente
2
+1. Además, para propósitos de prueba se puede añadir el "whatif" bandera: Remove-Item $File -whatif | out-null. Para ejecutarse como una tarea programada, el trabajo debe especificar la ruta completa a powershell.exe con su script nombrado como argumento.
AndyN
Se me ocurrió la misma solución para empezar, pero me encontré con problemas con la carga de memoria asociada con la obtención de todos los archivos por adelantado.
Tim Barrass
13
archivos -pc: \ pathtofiles \ -m * .rar -d -5 -c "cmd / c del @path"

¿Dónde -5está la antigüedad de los archivos que desea eliminar (5 días o más en este caso)? Este script está eliminando .rararchivos; suelte el -m *.rarsi desea eliminar cualquier tipo de archivo.

Mark Henderson
fuente
1
De todas estas respuestas, esta es la única (hasta ahora) que responde directamente a la pregunta.
John Gardeniers
3

Si insiste en usar archivos por lotes, Robocopy.exe es su respuesta. Es rápido (multiproceso) y muy robusto. Para su escenario, puede usar lo siguiente como guía:

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

Hay una larga lista de opciones, robocopy /? para verlos a todos. Incluso puede usarlo para hacer copias de seguridad incrementales, programar, crear perfiles de copia de seguridad, etc.

Dharma Leonardi
fuente
¡Todos los +1 para robocopy! <3 Re su ejemplo: no estoy seguro de si el modificador / MIR es el adecuado para esta situación, el / MOVE debería ocuparse de la pregunta de Chiggins. Una cosa es segura, la robocopia tiene un montón de opciones, se requiere un examen cuidadoso.
JamesCW
2

Me gusta usar DelEn.exe para esto.

Delen - DELete ENhanced - es una versión mejorada de DEL. Admite comodines extendidos y directorios principales, así como filtros de fecha, hora y tamaño. Los archivos se pueden excluir de la eliminación.

jftuga
fuente
2

Puede mirar DelAge32 de 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

Su comando puede ser tan simple como:

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

Tengo este comando ejecutándose como una tarea programada.

RobW
fuente
Esto se marca como una amenaza en Cylance.
Dom
Delage32.exe obtiene una calificación de 0/53 en virustotal.com, donde cero significa que no se detectaron amenazas entre las 53 principales herramientas AV. Es posible que desee cambiar su AV a algo más convencional.
RobW
No es mi elección. Solo estoy advirtiendo a cualquiera que use Cylance que renuncie a delage32 o use forfiles
Dom
1

Este es un script de PowerShell que escribí para hacer lo que quieres, también hace un poco más. Lo uso para borrar registros y otros archivos temporales.

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!"
      }
Ian Murphy
fuente
1

Esto no funcionará para computadoras remotas. Los administradores deben administrar varias computadoras. A continuación se muestra el script que se puede usar para eliminar carpetas en varias computadoras remotas sin tener que iniciar sesión en ellas.

El siguiente script eliminará las carpetas con más de 15 días de antigüedad. Sin embargo, puede cambiar el parámetro $ días.

D $ \ Archivos de programa (x86) \ Research In Motion \ BlackBerry Enterprise Server \ Logs es la ruta UNC para la carpeta Blackberry Log. Puede cambiar el directorio donde se encuentran sus registros / carpetas.

Enumere todos los nombres de sus servidores en el archivo server.txt y debe ubicarse en el mismo directorio que este 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
}

Guarde el script como .ps1 y ejecútelo. Puede programarlo a través de un archivo por lotes. De esa manera, debe agregar el comando Cambiar directorio al comienzo del script.

Que te diviertas.

VJ Kumar
fuente
0

Como un enfoque alternativo: en lugar de confiar en consultar el sistema de archivos para obtener tiempos de creación de archivos (y presionar los mismos archivos durante varios días, hasta que caduquen), puede agregar el archivo a un índice propio en el momento de la creación. El índice podría ser tan simple como un archivo con el nombre de la fecha de creación, almacenado en una ubicación conocida, con un archivo por línea.

Si tiene una aplicación multiproceso / multiproceso que crea archivos, es posible que desee que su índice se maneje de una manera más sofisticada.

La ventaja sería que siempre tiene una lista de archivos procesada de manera relativamente simple creada en un día determinado que puede repetir, en lugar de tener que pedirle al sistema de archivos una y otra vez los detalles.

(Esto dependería de que la aplicación y la creación de archivos sean administradas por usted y no por un tercero).

Tim Barrass
fuente