2010-07-24 3 views
5

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

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.

спасибо.

ответ

0

попробовать test?.log

+0

Не работает - вы можете попробовать его в оболочке: 'echo> test.log; echo> test1.log; dir test? .log' найдет 2 файла. – schnaader

1

Как 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, но это может быть очень неприятно.

+0

спасибо .. Я мог заставить его работать таким образом, также вы подтвердили, что в пакетном скрипте нет регулярных выражений. – bsr

1

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

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

+0

спасибо .. +1 за идею. – bsr

+1

Как насчет 'for/l'? – Joey

+0

* @ Johannes Rössel: * Это, добрый сэр, на самом деле был бы умнее, чем я предлагал. ;-) (я узнал что-то новое сегодня ...) – stakx

1

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

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

+0

Я попробую это .. спасибо .. – bsr

Смежные вопросы