Regex в пакетном скрипте Win7? - PullRequest
0 голосов
/ 06 марта 2012

У меня есть такие имена файлов:

M0654871_07_05_2011.pdf
M0654871_07_15_2011.pdf

Где 07_05_2011 - дата (MM_DD_YYYY) и первый номер после Mэто просто "случайное" число.

Я пишу .bat файл, который зацикливается на все файлы в этом каталоге.Я хочу, чтобы скрипт подсчитывал файлы каждый день (основываясь на имени файла, а не на дате изменения).

Не похоже, что в пакетном сценарии есть регулярное выражение.Есть ли способ сделать это в сценариях Windows .bat, не загружая больше инструментов / программного обеспечения?

(я мог бы, вероятно, сделать сложный цикл проверки строки для каждой строки имени файла для каждого дня, но этонемного больше, учитывая, что есть 10k + файлов).

Я обнаружил, что findstr может выполнять регулярные выражения в некотором роде, но есть ли способ использовать его для циклического перемещения по файлам и извлечения количества файлов за дату вместо циклическогопо датам и извлечению количества файлов?

1 Ответ

1 голос
/ 06 марта 2012

В FINDSTR нет ничего, чтобы делать то, что вы хотите напрямую, но это легко сделать с циклом FOR в сочетании с подстрокой расширения и арифметикой SET.

Следующий код (без FINDSTR) может быть хорошимдостаточно, в зависимости от того, какие другие файлы могут существовать в каталоге (не проверено, но должно работать, если я не позволю глупой ошибке проскользнуть).Код работает путем создания переменной count с именем на основе даты в имени файла.

@echo off
setlocal enableDelayedExpansion
for %%F in (M*_??_??_????.pdf) do (
  set "fname=%%~nF"
  set /a fileDate_!fname:~-10!+=1
)
set fileDate_

Если вы хотите более точно искать действительные даты в последних 10 символах имени, то выможет передать вывод DIR в регулярное выражение FINDSTR.(снова не проверено)

@echo off
setlocal enableDelayedExpansion
for /f %%F in ('dir /b M*_??_??_????.pdf ^| findstr /lixc:"M[0-9]*_[01][0-9]_[0-3][0-9]_[0-9][0-9][0-9][0-9]') do (
  set "fname=%%~nF"
  set /a fileDate_!fname:~-10!+=1
)
set fileDate_

Регулярное выражение не ограничивается точными датами, но, скорее всего, оно адекватно.Вы можете быть более точным, используя несколько строк поиска регулярных выражений, но жесткие ограничения FINDSTR усложнят его, чем это должно быть (см. Каковы недокументированные функции и ограничения команды Windows FINDSTR? )

...