2016-11-05 5 views
1

Как вы можете удалить новый файл в папке с помощью пакетного скрипта?Batch File delete newest file

Все результаты, которые я нашел, ТОЛЬКО показывают, как удалить самые старые файлы или удалить их после N дней.

ссылки являются: Batch file to delete files older than N days и Batch Script to delete oldest folder in a given folder

Спасибо

ответ

1

Я хотел бы сделать это:

@echo off 
set latest= 
set the_directory=your_directory 

for /F %%a in ('dir /B /OD /A-D %the_directory%') do set latest=%%a 

del %the_directory%\%latest% 

запустить dir на файлы только с сортировкой по дате изменения. Затем выполните цикл и сохраните последний эхо-файл. Удалите его (заменить echo, чтобы проверить!)

1

Следующий фрагмент кода делает то, что вы хотите:

set "FILE=" 
pushd "\path\to\folder" || exit /B 1 
for /F "eol=| delims=" %%F in (' 
    dir /B /A:-D /O:D /T:C "*.*" 
') do (
    set "FILE=%%F" 
) 
if defined FILE del "%FILE%" 
popd 

В dir команда возвращает только файлы (/A:-D) сортируются по дате в порядке возрастания (/O:D) с использованием дата создания (/T:C), которые находятся в \path\to\folder и соответствуют рисунку *.*.
Петля for /F просматривает все файлы, возвращенные dir, и присваивает свое имя переменной FILE, переписывая ее на каждой итерации, поэтому окончательное значение - это имя самого нового файла. Команда del, наконец, удаляет найденный файл. Запрос if охватывает случай, когда файлы не найдены в данном месте.


Вот немного модифицированный вариант в соответствии с рекомендациями Магу-х comment, которые могли бы быть немного более производительным, чем вышеупомянутая одно:

set "FILE=" 
pushd "\path\to\folder" || exit /B 1 
for /F "eol=| delims=" %%F in (' 
    dir /B /A:-D /O:-D /T:C "*.*" 
') do (
    if not defined FILE set "FILE=%%F" 
) 
if defined FILE del "%FILE%" 
popd 

Это позволяет избежать multiplicately перезаписи переменной FILE, запрашивая, имеет ли он уже определены. Обратите внимание на обратный порядок сортировки от dir.

Однако подход, показанный в документе от Magoo, по-прежнему лучше работает.

2
for /F %%a in ('dir /B /O-D /A-D %the_directory%') do echo("%the_directory%\%%a"&goto deldone 
:deldone 

будет моим подходом. Он грубо убегает из цикла for, удалив первое имя файла, обнаруженное в списке отсортированного в обратном порядке (/o-d).

Это экономит необходимость чтения всего списка. Не такая проблема с несколькими файлами, но может быть болью с тысячами.

Необходимая команда DEL - это просто ECHO ed для целей тестирования. После того, как вы подтвердили правильность команды, смените ECHO(DEL на DEL, чтобы фактически удалить файлы.

+0

Я думал об этом методе, но, хотя производительность, безусловно, лучше, я решил не использовать его здесь, так как это может вызвать проблемы, если оно вставлено в скрипт, если оно помещено в другой скобковый блок кода. , – aschipfl

+0

@aschipfl: достаточно справедливо, но есть пределы. В вашем примере вы, возможно, получите лучшую производительность с 'if not defined file set 'file = %% F" '. – Magoo

+0

Ах, да, запрос переменной может быть быстрее, чем умножать ее, спасибо! – aschipfl