Подтвердить что ты не робот

Пакетный файл, в котором хранятся 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% 

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

4b9b3361

Ответ 1

Вы можете использовать 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"

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

Ответ 2

Пакетный файл ниже использует более простой подход. Он использует команду 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"
)

Антонио

Ответ 3

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

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

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

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

Внутри пакета script

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