Пакетный файл: перебирать файлы, измененные с указанной даты - PullRequest
2 голосов
/ 13 августа 2010

Я хочу создать командный файл, который выполняет команду (для простого примера удалите файл, хотя моя команда настраиваемая / отличается) для каждого файла, соответствующего шаблону (скажем, * .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 Ответ

3 голосов
/ 14 августа 2010

Первые несколько предварительных данных:

  • 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».

Но теперь начинается настоящая проблема: дата и время создания могут быть напечатаны в разных форматах, в зависимости от вашей «локали».Вы сами видите, как это выглядит для меня в настоящее время.

Разве это не сработало бы, если бы мы могли отобразить дату в формате, который бы точно соответствовал числовому порядку?Тогда мы могли бы реализовать некоторую логику, которая решает вопрос об удалении путем простого сравнения чисел.Давайте попробуем (если это работает для меня, это не обязательно будет работать для вас - вам, возможно, придется адаптироваться к вашей локали).Обратите внимание на 'обратные кавычки' ("` `"), которые я использую, а также знак ^:

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.

...