2016-09-22 2 views
2

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

Мое переименование очень удобно, поэтому мне нужно создать дискретную запись для каждого файла. Например, вот три линии:

REN STWP01_00669087* BCBSRI-01849351* 
REN BCBSRI-01849357* 2011-12-19_BCBSRI-01849357* 
REN STWP01_00669094* BCBSRI-01849369* 

Я экспериментировал с FOR /R command, в том числе пытаясь отдельный пакетный файл, который вызывает мой переименованием пакетный файл (через CALL command). Не повезло.

Я должен предположить, что это просто, но я начинающий новичок, поэтому любая помощь будет оценена по достоинству.

Спасибо!


@Magoo,

Большое спасибо за ваш ответ. Ваш подход будет намного более эффективным, чем мой собственный.

пару вопросов. Пожалуйста, несите меня, поскольку я новичок с командами.

Вот что я сделал: я сохранил ваш код в .BAT-файле («RRename.bat»), изменил свои имена файлов в соответствии с вашими инструкциями и сохранил их в текстовом файле («Filenames.txt»), а затем запустите эту команду из командной строки: {RRename.bat Filenames.txt}.

В результате окна команд подтверждают правильное переименование. И поэтому я удалил команды ECHO и PAUSE и снова запустил. Не повезло. Просто куча окон команд, подтверждающих каталог.

В идеале я хотел бы сохранить это как .BAT-файл и просто поместить его в каталог верхнего уровня вместе с файлом данных, который содержит старые имена и новые имена файлов. Таким образом, двойной щелчок «RRename.bat» будет анализировать содержимое «Filenames.txt» и прокладывать путь через все подпапки, переименовывая везде, где встречаются совпадения. Boom.

С этой целью:
1. Как сделать так, {SET «SourceDir =} указывает на текущий каталог (т.е. каталог, в котором пакетный файл находится) Таким образом, я бы никогда не нужно? измените эту переменную. (Я должен отметить, что я запускаю этот скрипт в сетевом расположении, что требует от меня сопоставления диска, в результате чего каждый раз записывается другая буква диска.)
2. Как я могу скорректировать имя файл данных в самом скрипте? Моя цель - легко реплицируемый процесс, минимизирующий ввод пользователя (за исключением содержимого файла данных).
3. Как я могу остановить появление отдельных окон команд? файлов за раз и не хотят видеть тысячи fo соответствующей команды окна.

Спасибо!

+0

Вы считали PowerShell? Если у вас есть систематический способ переименования, вы можете запрограммировать его в скрипте PowerShell else, если вы можете указать фактическое имя файла и имя, которое оно должно быть переименовано в файл csv, а затем сценарий PowerShell может его достичь. Если вы дадите нам пример того, как вы его переименуете, может быть, кто-то может дать вам и некоторый код. – Junaid

+0

См. [Этот ответ] (http://stackoverflow.com/questions/8397674/windows-batch-file-looping-through-directories-to-process-files/8398621#8398621) для другого, более простого способа сделать этот процесс ... – Aacini

ответ

2
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
:: read parameters 
SET "filename1=%~1" 
SET "filename2=%~2" 
IF DEFINED filename2 GOTO name 
IF NOT DEFINED filename1 GOTO :EOF 
:: 1 parameter - must be filename 
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO START /min "ren %%a" "%~f0" %%a 
GOTO :eof 

:: we have 2 parameters so rename pattern 1 to pattern 2 

:name 
FOR /r "%sourcedir%" %%a IN ("%filename1%*") DO CALL :process "%%a" 
PAUSE 

GOTO :EOF 

:: Process the filenames and actually do the rename 
:process 
:: Name of file to be changed - name and extension of %1 
SET "changeme=%~nx1" 
:: REPLACE up-to-from-pattern with nothing = remainder of name/extension 
CALL SET "endpart=%%changeme:*%filename1%=%%" 
:: and RENAME... 
ECHO(REN "%~1" "%filename2%%endpart%" 
GOTO :eof 

Вы должны были бы изменить установку sourcedir в соответствии с вашими обстоятельствами.

Пересмотренный файл данных

STWP01_00669087 BCBSRI-01849351 
BCBSRI-01849357 2011-12-19_BCBSRI-01849357 
STWP01_00669094 BCBSRI-01849369 

Направленная на обработку выше файла, переименование файлов, начиная (записей COLUMN1), чтобы начать

Метод (записей COLUMN2.):

Run партия, как

batchname filename

Это будет выполнять партия, обработка файла

Как:

усадив имя каталога, чтобы начать обработку из установите filename1&2 к значениям параметров поставки.

Если задано только 1, это имя файла, поэтому обработайте его по очереди и запустите новый процесс /min свести к минимуму «с именем окна в первом наборе кавычек» и выполнить эту же партию с данными из каждой строки файла, в свою очередь, затем закончить, перейдя в :eof (конец файла - встроенный в CMD)

суб-процессов все имеют 2 параметра (например, BCBSRI-01849357 2011-12-19_BCBSRI-01849357), поэтому обработка переходит к :name. Это запускает for /r петли, из указанного исходного каталога с именем, указанным в первой колонке + * и выполняет :process передавая имена файлов, найденные в качестве параметра 1.

:process наборы changeme к имени файла в вопросе, вычисляет endpart удаления строка filename1 от changeme, которая доставит эр, торцевую часть.

Затем просто переименуйте прилагаемое имя файла на заменяемое имя +, которое вычислено endpart.

Необходимые команды REN - это всего лишь ECHO ed для целей тестирования. После того, как вы подтвердили правильность команд, измените ECHO(REN на REN, чтобы фактически переименовать файлы.

Пауза - это просто, чтобы разрешить предлагаемые изменения. Как только процесс будет проверен, измените значение PAUSE на EXIT.

AAMOI, бег

*batchname* STWP01_00669094 BCBSRI-01849369 

, например, будет выполнять рекурсивный-переименовывать от STWP01_00669094 * до BCBSRI-01849369 *


К сожалению, "Не повезло" не имеет смысла.

Я внес незначительное, но значительное изменение в инструкции. PAUSE следует заменить на EXIT после тестирования.

После испытаний ECHO(... линия должна стать

REN "%~1" "%filename2%%endpart%" 

, который фактически выполняет переименование. Если вы только что удалили строку, это объяснит отсутствие видимого результата.

Восстановив исходный код и подтвердив его небольшим представительным поддеревом, измените строку echo(... и повторите проверку. Имена файлов следует изменить. Если нет, что-то ужасно неправильно. Излишне говорить, что это отлично работает для меня ...

Затем повторите попытку с помощью PAUSE, измененного на EXIT. На этот раз создаваемые окна появятся на панели задач и исчезнут, когда переименование этой строки входного файла закончено. Это произойдет один раз для BCBSRI-01849357 rentwo, например, не раз для каждого отдельного файла rename.

Для жесткого кода имя файла, удалить строку

IF NOT DEFINED filename1 GOTO :EOF 

и заменить

FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO START /min "ren %%a" "%~f0" %%a 

с

FOR /f "usebackqdelims=" %%a IN ("YOURFILENAMEHERE") DO START /min "ren %%a" "%~f0" %%a 

Для команды "запустить здесь", изменить

SET "sourcedir=U:\sourcedir" 

в

SET "sourcedir=." 

. означает "текущий каталог"

Если вы поместите thisbatchfilename.bat в любой каталог на PATH, то вы можете запустить процедуру просто выполнив thisbatchfilename ,

Вы можете отобразить свой путь, набрав

path 

в командной строке. PATH - это последовательность каталогов, поиск по окнам, чтобы найти исполняемый файл, если он не найден в текущем каталоге. Чтобы отслеживать путь, google «change path windows» - опытные дозаторы создают отдельный каталог на пути к пакетным файлам. Иногда они называют каталог «Колокольня».

+0

Большое спасибо за вашу помощь! Я добавил дополнительную информацию в вопрос и был бы признателен, если у вас появятся какие-то дополнительные мысли. – lneidorf

+0

@Magoo +1, нам нужно больше ответов вроде этого – samdd

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