Пакетный файл: маска файла

Я не мог найти детали о том, как использовать маску файла в пакетном файле. Мое требование,

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 .

спасибо.

7
задан Joey 28 July 2010 в 08:00
поделиться

4 ответа

Чтобы сопоставить имена файлов с регулярным выражением в пакетном файле, вы можете использовать следующий цикл 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 содержит полный путь к файлу, который соответствует регулярному выражению.

2
ответ дан 7 December 2019 в 12:13
поделиться

try test? .Log

0
ответ дан 7 December 2019 в 12:13
поделиться

Вы можете попробовать следующее, что я лично считаю ужасным, но это может быть именно то, что вам нужно:

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 ), если, конечно, это действительно то, что вам нужно сделать.

2
ответ дан 7 December 2019 в 12:13
поделиться

Поскольку 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, но это может быть очень раздражающим.

1
ответ дан 7 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: