it-swarm.com.ru

Пакетный файл, который хранит 7 последних файлов в папке

Может кто-нибудь помочь мне создать командный файл? По сути, моя цель - создать пакетный файл, который будет хранить файлы LATEST 7 .txt (другими словами, самые новые) в папке, а затем удалять остальные. Вот если в папке более 7 файлов. 

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

Так вот что у меня есть -

@echo off

setlocal enableextensions

rem ********************************************************************************
rem *******************************  LOCAL VARIABLES  ******************************
rem ********************************************************************************

SET TargetDirectory="C:\TEMP\test"

SET No_of_fles_to_keep=7

SET count=0 

set cnt=0

rem ********************************************************************************

cd /d %TargetDirectory%

REM timeout /T 500

 for %%x in (*) do set /a count+=1

 for %%A in (*.bat) do set /a cnt+=1

cd /d %TargetDirectory%

REM timeout /T 500

IF %count% gtr %No_of_fles_to_keep% forfiles -p %TargetDirectory% -s -m "*.txt" -d -%No_of_fles_to_keep% -c "cmd /c del @path"

echo %count% 

echo File count = %cnt% 

Любая помощь приветствуется. 

15
Knowledge42

Вы можете использовать DIR с /O-D для вывода списка текстовых файлов в порядке убывания метки времени. FOR/F позволяет перебирать каждый файл. SET/A используется для отслеживания количества файлов, перечисленных на данный момент. Теперь самое сложное.

Внутри блока кода вам обычно нужно использовать отложенное расширение для работы со значением переменной, которое было установлено ранее в том же блоке. Но отложенное расширение может вызвать проблемы в цикле FOR, если значение переменной FOR содержит !, а ! допустим в именах файлов. Я обошел проблему, используя SET/A, чтобы преднамеренно разделить на 0, когда 7-е имя файла было прочитано. Это вызывает ошибку, которая приводит к выполнению условного кода, который не определяет переменную KEEP. С этого момента все оставшиеся файлы будут удалены.

@echo off
setlocal
set /a cnt=0
set "keep=7"
for /f "eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do (
  if defined keep (
    2>nul set /a "cnt+=1, 1/(keep-cnt)" || set "keep="
  ) else del "%%F"
)

Обновить

Боже мой, я только что понял, что есть тривиальное решение. Просто используйте опцию FOR/F SKIP, чтобы игнорировать первые 7 записей после сортировки по дате последнего изменения по убыванию.

for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F"

Вам даже не нужен командный файл. Просто измените %% на %, если запустить из командной строки.

29
dbenham

Пакетный файл ниже использует более простой подход. Он использует команду findstr /N "^" для нумерации каждого файла, затем просто сравнивает каждое число, чтобы сохранить первые семь файлов и удалить остальные ...

@echo off
for /f "tokens=1* delims=:" %%a in ('dir /b /o-d *.txt ^| findstr /N "^"') do (
   if %%a gtr 7 del "%%b"
)

Антонио

2
Aacini

Это сохранит 7 последних файлов .txt и удалит все остальные файлы .txt

Выполните команду ниже в том же каталоге, из которого вы хотите удалить файлы

В командной строке

for /f "skip=7 eol=: delims=" %F in ('dir /b /o-d /a-d *.txt') do @del "%F"

Внутри пакетный скрипт

for /f "skip=7 eol=: delims=" %%F in ('dir /b /o-d /a-d *.txt') do @del "%%F"
0
Sarang A