Пакетный файл для удаления файлов старше N дней - PullRequest
634 голосов
/ 09 сентября 2008

Я ищу способ удалить все файлы старше 7 дней в пакетном файле. Я искал в Интернете и нашел несколько примеров с сотнями строк кода, и другие, для выполнения которых требовалась установка дополнительных утилит командной строки.

Подобные вещи можно сделать в BASH всего за пару строк кода. Кажется, что-то хотя бы удаленно можно сделать для пакетных файлов в Windows. Я ищу решение, которое работает в стандартной командной строке Windows, без каких-либо дополнительных утилит. Пожалуйста, не PowerShell или Cygwin либо.

Ответы [ 23 ]

2 голосов
/ 15 августа 2016

ROBOCOPY прекрасно работает для меня. Первоначально предложил мой Иман. Но вместо того, чтобы перемещать файлы / папки во временный каталог, а затем удалять содержимое временной папки, перемещать файлы в корзину !!!

Это несколько строк моего резервного файла, например:

SET FilesToClean1=C:\Users\pauls12\Temp
SET FilesToClean2=C:\Users\pauls12\Desktop\1616 - Champlain\Engineering\CAD\Backups

SET RecycleBin=C:\$Recycle.Bin\S-1-5-21-1480896384-1411656790-2242726676-748474

robocopy "%FilesToClean1%" "%RecycleBin%" /mov /MINLAD:15 /XA:SH /NC /NDL /NJH /NS /NP /NJS
robocopy "%FilesToClean2%" "%RecycleBin%" /mov /MINLAD:30 /XA:SH /NC /NDL /NJH /NS /NP /NJS

Он удаляет все, что старше 15 дней, из моей папки «Temp» и 30 дней для всего, что находится в моей папке резервного копирования AutoCAD. Я использую переменные, потому что строка может быть довольно длинной, и я могу использовать их для других мест. Вам просто нужно найти путь до вашей корзины, связанной с вашим логином.

Это у меня на рабочем компьютере и работает. Я понимаю, что некоторые из вас могут иметь более ограничительные права, но все равно попробуйте;) Поищите в Google объяснения по параметрам ROBOCOPY.

Ура!

1 голос
/ 15 июля 2017

Мой скрипт для удаления файлов старше определенного года:

@REM _______ GENERATE A CMD TO DELETE FILES OLDER THAN A GIVEN YEAR
@REM _______ (given in _olderthanyear variable)
@REM _______ (you must LOCALIZE the script depending on the dir cmd console output)
@REM _______ (we assume here the following line's format "11/06/2017  15:04            58 389 SpeechToText.zip")

@set _targetdir=c:\temp
@set _olderthanyear=2017

@set _outfile1="%temp%\deleteoldfiles.1.tmp.txt"
@set _outfile2="%temp%\deleteoldfiles.2.tmp.txt"

  @if not exist "%_targetdir%" (call :process_error 1 DIR_NOT_FOUND "%_targetdir%") & (goto :end)

:main
  @dir /a-d-h-s /s /b %_targetdir%\*>%_outfile1%
  @for /F "tokens=*" %%F in ('type %_outfile1%') do @call :process_file_path "%%F" %_outfile2%
  @goto :end

:end
  @rem ___ cleanup and exit
  @if exist %_outfile1% del %_outfile1%
  @if exist %_outfile2% del %_outfile2%
  @goto :eof

:process_file_path %1 %2
  @rem ___ get date info of the %1 file path
  @dir %1 | find "/" | find ":" > %2
  @for /F "tokens=*" %%L in ('type %2') do @call :process_line "%%L" %1
  @goto :eof

:process_line %1 %2
  @rem ___ generate a del command for each file older than %_olderthanyear%
  @set _var=%1
  @rem  LOCALIZE HERE (char-offset,string-length)
  @set _fileyear=%_var:~0,4%
  @set _fileyear=%_var:~7,4%
  @set _filepath=%2
  @if %_fileyear% LSS %_olderthanyear% echo @REM %_fileyear%
  @if %_fileyear% LSS %_olderthanyear% echo @del %_filepath%
  @goto :eof

:process_error %1 %2
  @echo RC=%1 MSG=%2 %3
  @goto :eof
1 голос
/ 19 мая 2017

Этот сделал это для меня. Он работает с датой, и вы можете вычесть нужную сумму в годах, чтобы вернуться во времени:

@echo off

set m=%date:~-7,2%
set /A m
set dateYear=%date:~-4,4%
set /A dateYear -= 2
set DATE_DIR=%date:~-10,2%.%m%.%dateYear% 

forfiles /p "C:\your\path\here\" /s /m *.* /d -%DATE_DIR% /c "cmd /c del @path /F"

pause

/F в cmd /c del @path /F вызывает удаление определенного файла, в некоторых случаях файл может быть доступен только для чтения.

dateYear - это переменная года, и вы можете изменить субстрат в соответствии со своими потребностями

...