2013-07-12 2 views
1

У меня есть список файлов. Каждый день я создаю новый список файлов. Мне нужно сохранить этот список ранее созданных файлов. Я хотел бы добавить и число к концу вчерашнего файла, и я хотел бы, чтобы увеличить все предыдущие файлы 1, так что вчерашняя файл всегда 0001. Например:Использовать пакетный файл для переименования файлов и приращения postfix

Файлы генерироваться вчера являются:

P.xls 
T.xls 
W.xls 

Я хотел бы запустить пакетный файл, который называет их:

P0001.xls 
T0001.xls 
W0001.xls 

Ok. Я могу сделать эту часть. Ничего страшного. Файлы всегда называются P, T и W, поэтому эта часть проста. Сложнее всего переименовать P0001.xls, T0001.xls и W0001.xls каждый день. Я могу сделать пакетный файл, который начинается так:

rename P9998.xls P9999.xls 

и работать свой путь вниз к P0001.xls, но это смешно. Я не хочу вводить 10 000 строк для каждого файла.

Любая помощь по этому пакетному файлу будет принята с благодарностью.

Кит

ответ

0

Вместо того, чтобы перебирать все возможные номера, более эффективно обрабатывать только файлы, которые существуют. Я временно добавляю .ren к файлам в качестве первого шага, так что мне не нужно беспокоиться о обработке в порядке убывания.

Это решение предполагает, что все существующие файлы .XLS, начинающиеся с P W или T, должны быть переименованы и следовать правильному соглашению об именах. Он также предполагает, что файлы, которые будут переименованы, находятся в текущем каталоге.

@echo off 
setlocal enableDelayedExpansion 
for %%C in (P T W) do ren %%C*.xls *.*.ren 
ren ?.xls.ren ?0000.* 
for %%F in (*.xls.ren) do (
    set "num=%%F" 
    set /a "num=1!num:~1,4! - 9999" 
    set "num=000!num!" 
    ren %%F ?!num:~-4!.xls 
) 

Вот более прямой, но, возможно, менее эффективный вариант, который благополучно игнорирует .xls файлы, начинающиеся с P T или W, которые не соответствуют соглашению об именах. Здесь я сортирую файлы в порядке убывания, так что мне нужно только переименовать каждый файл один раз.

@echo off 
setlocal enableDelayedExpansion 
for /f "delims=" %%F in (
    'dir /b /a-d /o-n *.xls^|findstr /rix [PTW][0-9][0-9][0-9][0-9].xls' 
) do (
    set "num=%%F" 
    set /a "num=1!num:~1,4! - 9999" 
    set "num=000!num!" 
    ren %%F ?!num:~-4!.xls 
) 
for %%C in (P T W) do ren %%C.xls ?0001.* 

Я использую некоторые малоизвестные особенности того, как REN обрабатывает подстановочные знаки. См. How does the Windows RENAME command interpret wildcards? для получения дополнительной информации.

+0

You Rock !! Именно то, что мне нужно, и это работает СОВЕРШЕННО !! –

+0

@KeithMungo - Не забудьте принять ответ, если он полностью отвечает на ваш вопрос. Просто нажмите галочку возле левого верхнего угла. Это действие позволяет другим узнать, на какой вопрос был дан ответ, он награждает вас 2 очками репутации и награждает ответный стенд 15 очками. – dbenham

+0

@MethodMan - не задавайте новые вопросы в качестве комментариев к существующим ответам. Если у вас есть вопрос, задайте свой вопрос. – dbenham

0

Пакетный файл ниже обеспечивает желаемое переименование быстрее, потому что он обрабатывает номера файлов вместо имен файлов, поэтому в каждом цикле переименовываются 3 файла; Кроме того, цикл for /L работает быстрее обычного for с именами файлов. Скорость важна, если количество файлов велико.

@echo off 
setlocal EnableDelayedExpansion 

rem Rename files generated yesterday 
ren ?.xls ?0000.xls 

rem Get the number of the last file 
for /F "delims=" %%a in ('dir /B /A-D /O-N *.xls') do (
    set lastName=%%a 
    goto continue 
) 
:continue 
set /A oldNumber=1%lastName:~1,4%, newNumber=oldNumber+1, numFiles=newNumber-10000 

rem Rename all files 
for /L %%a in (1,1,%numFiles%) do (
    ren ?!oldNumber:~1!.xls ?!newNumber:~1!.xls 
    set /A oldNumber-=1, newNumber-=1 
) 
Смежные вопросы