Я не мог найти детали о том, как использовать маску файла в пакетном файле. Мое требование,
forfiles -p "C:\what\ever" -s -m *.log -c "cmd /c somecommmand"
вместо того, чтобы выбрать все файлы журнала (*.log), как выбрать все файлы журнала, который имеет целочисленный суффикс в конце. Например, Среди следующих файлов,
test.log, test1.log, test2.log, test3.log..
Мне нужна маска файла для выбора всех кроме test.log
Я попробовал test*.log
, но это slects test.log также. Предпочтительно не включать часть имени файла (тест). что-то как, *<0-9d>.log
.
спасибо.
Чтобы сопоставить имена файлов с регулярным выражением в пакетном файле, вы можете использовать следующий цикл for в качестве шаблона:
for /F "delims=" %%I in ('"dir /B /S | findstr /E "\\test[0-9][0-9]*\.log""') do (
echo %%I
)
Он просто печатает полные пути ко всем файлам в текущем каталоге и его подкаталогах, имена которых совпадают test1.log, test2.log, test3.log, ...
Команда dir
создает список дерева каталогов из текущего каталога. Каждая строка содержит полный путь. Список передается по конвейеру с помощью команды findstr
, которая сопоставляет полные пути с заданным регулярным выражением. На каждой итерации переменная for %% I
содержит полный путь к файлу, который соответствует регулярному выражению.
Вы можете попробовать следующее, что я лично считаю ужасным, но это может быть именно то, что вам нужно:
FOR %i IN (1 2 3 4 5 6 7 8 9 10 11 12 13 ...) DO IF EXIST test%i.log (somecommand)
Если суффикс действительно любое целое число в потенциально очень большой диапазон, это не сработает - если вы не вложите несколько циклов FOR
, каждый из которых обрабатывает только одну цифру, и вы не измените IF EXIST test% i.log
на что-то вроде IF EXIST test% a% b% c% d.log
(для четырех цифр).
Также нет необходимости выполнять somecommand
в отдельной оболочке ( CMD / C
), если, конечно, это действительно то, что вам нужно сделать.
Поскольку test?.log
и даже test?.log
найдет и test.log
, единственное, что можно сделать, чтобы получить то, что вы хотите, это какой-то обходной путь, например:
if exist test.log ren test.log test.tmp
REM Do your stuff here, you can now use test*.log
if exist text.tmp ren test.tmp test.log
Я не знаю, является ли это неожиданное поведение ? (не означающее ровно один символ, а максимум один символ) является чем-то специфическим для Windows или так было со времен DOS, но это может быть очень раздражающим.