Пакетный файл: перебирать файлы, измененные с указанной даты
Я хочу создать командный файл, который выполняет команду (для простого примера удалите файл, хотя моя команда настраивается / отличается) для каждого файла, соответствующего шаблону (скажем, *.jpg), который был изменен с некоторой даты (например, 1-1-2010 или позже). Дата может быть жестко задана в командном файле или передана в качестве параметра командной строки.
псевдокод:
foreach file C:\Images\*.jpg modified-since 1-1-2010 do
del file
Я бы предпочел чистый пакетный файл, а не PowerShell, VBScript и т. Д. Если использование чистого пакетного языка невозможно, я мог бы использовать небольшую / бесплатную стороннюю программу командной строки, чтобы помочь с генерацией списка измененных файлов. Мне нужно поддерживать запуск в Windows 2000 или более поздней версии.
Окончательное решение, которое я использовал:
(Слегка изменено ответом от pipitas)
@ECHO OFF
for /f "usebackq tokens=1-7* delims=/: " %%I in (`dir/o-d/tw ^| findstr /I .jpg`) do (
if "%%K%%I%%J %%N %%L%%M" GEQ "20100801 AM 0000" (
del /P %%P
)
)
Некоторые примечания: Удалить /P, чтобы не требовать подтверждения Y/N при каждом удалении. Я экранировал символы%, чтобы они работали внутри файла.bat. ^ Необходимо убежать от трубы. "Usebackq" заставляет обратные метки разделять команду для выполнения (вместо поиска литеральной строки или файла), tokens устанавливает количество переменных для размещения проанализированной строки, начиная с%I, а delims устанавливает разделители (включая завершающий пробел).) используется для разбора строки на эти токены.
Я добавил.jpg в качестве строки поиска findstr, поскольку я хотел обрабатывать только файлы.jpg. Некоторые возможные проблемы заключаются в том, что ваш языковой стандарт может печатать даты по-разному, требуя различного числа переменных или разных разделителей, и у вас могут быть некоторые ложноположительные совпадения со встроенным ".jpg" в имени файла (требуется регулярное выражение findstr и т. Д.),
Если вам не нужна поддержка Windows 2000 и более ранних версий, используйте forfiles
как предположил Йоханнес, это намного облегчит.
1 ответ
Сначала несколько предварительных замечаний:
dir /od /tw /s ..\path\to\somedir
: перечисляет все файлы каталога + подкаталоги, отсортированные по дате + времени последней модификации,dir /o-d /tw /s ..\path\to\somedir
: то же самое, но в обратном порядке (самый старый последний).
Далее я использую локальный пример для существующего пути. Поехали:
dir /tc /o-d /s gstmp\*yell*.tif ^| findstr 2010
Volume in Laufwerk C: hat keine Bezeichnung.
Volumeseriennummer: D479-1658
Verzeichnis von C:\downloads\gstmp
08/06/2010 05:01 PM 19 compression-g4-emptypage-tiffsep1(Yellow).tif
08/06/2010 05:00 PM 19 compression-lzw-emptypage-tiffsep1(Yellow).tif
08/06/2010 04:57 PM 19 compression-g3-tiffsep1(Yellow).tif
08/06/2010 04:57 PM 19 compression-crle-tiffsep1(Yellow).tif
08/06/2010 04:56 PM 19 compression-pack-share-tiffsep1(Yellow).tif
08/06/2010 04:53 PM 19 compression-g4-share-tiffsep1(Yellow).tif
08/06/2010 04:52 PM 19 compression-lzw-share-tiffsep1(Yellow).tif
08/06/2010 04:51 PM 19 compression-default-share-tiffsep1(Yellow).tif
08/06/2010 03:59 PM 19 compression-none-share-tiffsep.Yellow.tif
08/06/2010 03:55 PM 19 share-tiffsep.Yellow.tif
10 Datei(en) 190 Bytes
Нам не нравится дополнительный заголовок и сводная информация в данный момент. Мы можем избавиться от этого, фильтруя что-то. Я просто буду использовать "2010".
Но теперь начинается настоящая проблема: дата и время создания могут быть напечатаны в разных форматах, в зависимости от вашей локали. Вы сами видите, как это выглядит сейчас для меня.
Разве это не сработало бы, если бы мы могли отображать дату в формате, который бы точно соответствовал числовому порядку? Тогда мы могли бы реализовать некоторую логику, которая решает вопрос об удалении посредством простого сравнения чисел. Давайте попробуем (если это работает для меня, это не обязательно будет работать для вас - возможно, вам придется перейти на ваш язык). Обратите внимание на 'backquotes' ("``"), который я использую, а также знак ^:
for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif ^
^| findstr 2010`) do echo. %I %J %K %L %M %N %O %P
Вывод здесь:
08 06 2010 05 01 PM 19 compression-g4-emptypage-tiffsep1(Yellow).tif
08 06 2010 05 00 PM 19 compression-lzw-emptypage-tiffsep1(Yellow).tif
08 06 2010 04 57 PM 19 compression-g3-tiffsep1(Yellow).tif
08 06 2010 04 57 PM 19 compression-crle-tiffsep1(Yellow).tif
08 06 2010 04 56 PM 19 compression-pack-share-tiffsep1(Yellow).tif
08 06 2010 04 53 PM 19 compression-g4-share-tiffsep1(Yellow).tif
08 06 2010 04 52 PM 19 compression-lzw-share-tiffsep1(Yellow).tif
08 06 2010 04 51 PM 19 compression-default-share-tiffsep1(Yellow).tif
08 06 2010 03 59 PM 19 compression-none-share-tiffsep.Yellow.tif
08 06 2010 03 55 PM 19 share-tiffsep.Yellow.tif
Мы почти на месте, но еще не полностью. Нам нужно изменить порядок наших токенов %I %J %K
в %K %I %J
так что наша дата отображается как 2010 08 06
вместо 08 06 2010
, Кроме того, если мы напишем правильные токены без пробелов, получим строку дата + время, чтобы ее можно было легко сравнить. Плюс, мы пропускаем %O
и замените его стрелкой, просто для удовольствия:
for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif ^
^| findstr 2010`) do echo. %K%I%J%L%M%N ==^> %P
Вывод меняется теперь на это:
201008060501PM ==> compression-g4-emptypage-tiffsep1(Yellow).tif
201008060500PM ==> compression-lzw-emptypage-tiffsep1(Yellow).tif
201008060457PM ==> compression-g3-tiffsep1(Yellow).tif
201008060457PM ==> compression-crle-tiffsep1(Yellow).tif
201008060456PM ==> compression-pack-share-tiffsep1(Yellow).tif
201008060453PM ==> compression-g4-share-tiffsep1(Yellow).tif
201008060452PM ==> compression-lzw-share-tiffsep1(Yellow).tif
201008060451PM ==> compression-default-share-tiffsep1(Yellow).tif
201008060359PM ==> compression-none-share-tiffsep.Yellow.tif
201008060355PM ==> share-tiffsep.Yellow.tif
Теперь вы почти готовы для сравнения первого поля.
Но учтите это: я получаю свое время в циклах по 12 часов, с AM
а также PM
, Таким образом, чтобы сравнивать численно, мы должны заменить PM и AM числовым значением, таким образом, чтобы наш перевод 04:51 AM
а также 04:50 PM
по-прежнему будет сортировать численно в правильном направлении.
Теперь как насчет этого:
for /f "usebackq tokens=1-7* delims=/: " %I in (`dir/tc/o-d/s gstmp\*yell*.tif ^
^| findstr 2010`) do (
if "%K%I%J %N %L%M" GEQ "20100806 PM 0457" (
echo. [ %K-%I-%J %L:%M %N %P. ]
)
)
В этом списке перечислены все файлы, которые должны быть удалены, а также показаны их соответствующие даты. Чтобы действительно удалить, нам просто нужно заменить последний echo. ... %P.
по del/p/f/s %P
,
Это должно дать вам несколько идей:
http://forums.techguy.org/dos-pda-other/772656-dos-batch-file-delete-folders.html http://www.computerhope.com/forum/index.php?topic=60404.0