Pregunta Archivo por lotes para eliminar archivos anteriores a N días


Estoy buscando una manera de eliminar todos los archivos anteriores a 7 días en un archivo por lotes. He buscado en la web y he encontrado algunos ejemplos con cientos de líneas de código, y otros que requieren la instalación de utilidades de línea de comando adicionales para realizar la tarea.

Cosas similares pueden ser hecho en BASH en solo un par de líneas de código. Parece que se podría hacer algo al menos remotamente fácil para los archivos por lotes en Windows. Estoy buscando una solución que funcione en un símbolo del sistema estándar de Windows, sin ningún tipo de utilidades adicionales. Por favor, tampoco PowerShell o Cygwin.


593
2017-09-09 01:05


origen


Respuestas:


Disfrutar:

forfiles -p "C:\what\ever" -s -m *.* -d <number of days> -c "cmd /c del @path"

Ver documentación del archivo para más detalles.

Para más regalos, refiérase a Un índice A-Z de la línea de comandos de Windows XP.

Si no tienes forfiles instalado en su máquina, cópielo de Windows Server 2003 a su máquina con Windows XP en %WinDir%\system32\. Esto es posible ya que el EXE es totalmente compatible entre Windows Server 2003 y Windows XP.

Las versiones posteriores de Windows y Windows Server lo tienen instalado por defecto.

Para Windows 7:

La sintaxis ha cambiado un poco. Por lo tanto, el comando actualizado es:

forfiles /p "C:\what\ever" /s /m *.* /D -<number of days> /C "cmd /c del @path"

937
2017-09-09 01:18



Ejecuta lo siguiente comandos:

ROBOCOPY C:\source C:\destination /mov /minage:7
del C:\destination /q

Mueva todos los archivos (usando / mov, que mueve los archivos y luego los elimina en lugar de / move que mueve los archivos completos que luego se eliminan) a través de robocopy a otra ubicación, y luego ejecute un comando de eliminación en esa ruta y usted es todo bueno.

Además, si tiene un directorio con muchos datos, puede usar /mir cambiar


68
2018-05-27 08:40



Ok, me aburrí un poco y se me ocurrió esto, que contiene mi versión del reemplazo de época de Linux de un pobre limitado para el uso diario (sin retención de tiempo):

7daysclean.cmd

@echo off
setlocal ENABLEDELAYEDEXPANSION
set day=86400
set /a year=day*365
set /a strip=day*7
set dSource=C:\temp

call :epoch %date%
set /a slice=epoch-strip

for /f "delims=" %%f in ('dir /a-d-h-s /b /s %dSource%') do (
    call :epoch %%~tf
    if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)
)
exit /b 0

rem Args[1]: Year-Month-Day
:epoch
    setlocal ENABLEDELAYEDEXPANSION
    for /f "tokens=1,2,3 delims=-" %%d in ('echo %1') do set Years=%%d& set Months=%%e& set Days=%%f
    if "!Months:~0,1!"=="0" set Months=!Months:~1,1!
    if "!Days:~0,1!"=="0" set Days=!Days:~1,1!
    set /a Days=Days*day
    set /a _months=0
    set i=1&& for %%m in (31 28 31 30 31 30 31 31 30 31 30 31) do if !i! LSS !Months! (set /a _months=!_months! + %%m*day&& set /a i+=1)
    set /a Months=!_months!
    set /a Years=(Years-1970)*year
    set /a Epoch=Years+Months+Days
    endlocal& set Epoch=%Epoch%
    exit /b 0

USO

set /a strip=day*7 : Cambio 7 por el número de días para mantener.

set dSource=C:\temp : Este es el directorio inicial para buscar archivos.

NOTAS

Este es un código no destructivo, mostrará lo que hubiera pasado.

Cambio :

if !epoch! LEQ %slice% (echo DELETE %%f ^(%%~tf^)) ELSE echo keep %%f ^(%%~tf^)

a algo como:

if !epoch! LEQ %slice% del /f %%f

para que los archivos realmente se eliminen

febrero: está codificado a 28 días. Los años bissextiles es un infierno para agregar, realmente. si alguien tiene una idea que no agregue 10 líneas de código, adelante y publíquelo, así que lo agrego a mi código.

época: No tomé el tiempo en consideración, ya que la necesidad es eliminar archivos anteriores a una determinada fecha, tomar horas / minutos habría eliminado los archivos de un día que estaba destinado a mantener.

LIMITACIÓN

época da por hecho que su formato de fecha corta es AAAA-MM-DD. Necesitaría ser adaptado para otras configuraciones o una evaluación en tiempo de ejecución (leer sShortTime, configuración ligada al usuario, configurar el orden de campo apropiado en un filtro y usar el filtro para extraer los datos correctos del argumento).

¿Mencioné que odio el auto-formateo de este editor? elimina las líneas en blanco y el copiar y pegar es un infierno.

Espero que esto ayude.


21
2017-08-24 14:55



forfiles /p "v:" /s /m *.* /d -3 /c "cmd /c del @path"

Deberías hacer /d -3 (3 días antes) Esto funciona bien para mí. Entonces todos los lotes complicados podrían estar en el basurero. también forfiles no admite rutas de acceso UNC, por lo tanto, realice una conexión de red a un disco específico.


17
2018-06-08 07:46



Echa un vistazo a mi responder a un pregunta similar:

REM del_old.bat
REM usage: del_old MM-DD-YYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT
for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"

Esto elimina archivos anteriores a una fecha determinada. Estoy seguro de que se puede modificar para volver siete días después de la fecha actual.

actualizar: Noté que HerbCSO ha mejorado en el script anterior. Recomiendo usar su versión en lugar.


16
2017-08-24 15:11



Mi comando es

forfiles -p "d:\logs" -s -m*.log -d-15 -c"cmd /c del @PATH\@FILE" 

@PATH - es solo un camino en mi caso, así que tuve que usar @PATH\@FILE

además forfiles /? no funciona para mí también, pero forfiles (sin "?") funcionó bien.

Y la única pregunta que tengo: cómo agregar múltiples máscaras (por ejemplo ".log |.bak ")?

Todo esto con respecto a forfiles.exe que descargado aquí (en ganar XP)

Pero si está usando el servidor de Windows, forfiles.exe ya debería estar allí y difiere de la versión de ftp. Es por eso que debería modificar el comando.

Para Windows Server 2003 estoy usando este comando:

forfiles -p "d:\Backup" -s -m *.log -d -15 -c "cmd /c del @PATH"

11
2017-12-14 06:46



Para Windows Server 2008 R2:

forfiles /P c:\sql_backups\ /S /M *.sql /D -90 /C "cmd /c del @PATH"

Esto eliminará todo .sql archivos más antiguos que 90 dias.


7
2018-04-27 22:41



Copie este código y guárdelo como DelOldFiles.vbs.

USO SÓLO EN COMANDO PRONTO: cscript DelOldFiles.vbs 15

15 significa eliminar archivos anteriores a 15 días.

  'copy from here
    Function DeleteOlderFiles(whichfolder)
       Dim fso, f, f1, fc, n, ThresholdDate
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(whichfolder)
       Set fc = f.Files
       Set objArgs = WScript.Arguments
       n = 0
       If objArgs.Count=0 Then
           howmuchdaysinpast = 0
       Else
           howmuchdaysinpast = -objArgs(0)
       End If
       ThresholdDate = DateAdd("d", howmuchdaysinpast, Date)   
       For Each f1 in fc
     If f1.DateLastModified<ThresholdDate Then
        Wscript.StdOut.WriteLine f1
        f1.Delete
        n = n + 1    
     End If
       Next
       Wscript.StdOut.WriteLine "Deleted " & n & " file(s)."
    End Function

    If Not WScript.FullName = WScript.Path & "\cscript.exe" Then
      WScript.Echo "USAGE ONLY IN COMMAND PROMPT: cscript DelOldFiles.vbs 15" & vbCrLf & "15 means to delete files older than 15 days in past."
      WScript.Quit 0   
    End If

    DeleteOlderFiles(".")
 'to here

6
2018-01-26 01:36



Use para archivos.

Hay diferentes versiones. Los primeros usan parámetros de estilo de Unix.

Mi versión (para el servidor 2000 - note que no hay espacio después de los interruptores) -

forfiles -p"C:\what\ever" -s -m*.* -d<number of days> -c"cmd /c del @path"

Para agregar archivos for a XP, obtenga el exe de ftp://ftp.microsoft.com/ResKit/y2kfix/x86/

y agregarlo a C: \ WINDOWS \ system32


6
2017-11-14 14:56