Пакетная команда для переименования файлов в папках

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

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

Я хочу знать, есть ли способ написать командный файл, чтобы сделать следующее:

У меня есть тематическая папка, и в каждой тематической папке у меня есть имена учеников, буклет, который они делают в папке, а затем есть файл .doc или .docx.

Я хочу, чтобы командный файл переименовал файл во что бы то ни стало в Subject_Book # _Name.doc или .docx

Мои документы / Тема / Студент / Книга 1 / .doc

\Math A\Jim Book\Book 1 Addition\Addition Booklet.docx 
\Math A\Jim Book\Book 2 Subtraction\Subtraction Booklet.docx
Into
\Math A\Jim Book\Book 1 Addition\Math A_Addition Booklet_Jim Book.docx 
\Math A\Jim Book\Book 2 Subtraction\Math A_Subtraction Booklet_Jim Book.docx 
\Math A\Frank Sims\Book 1 Addition\Addition Booklet.docx 
\Math A\Frank Sims\Book 2 Subtraction\Subtraction Booklet.docx 
Into
\Math A\Frank Sims\Book 1 Addition\Math A_Addition Booklet_Frank Sims.docx 
\Math A\Frank Sims\Book 2 Subtraction\Math A_Subtraction Booklet_Frank Sims.docx 

Теперь я не возражаю, если мне придется копировать файл bat в каждую папку, если какой-нибудь замечательный человек может мне помочь и поместить его в основную папку темы.

Я видел что-то подобное где-то еще, но это все равно заняло бы много времени.

title Rename Bat
echo This bat must be in the folder that 
echo contains the files to be renamed.
echo Enter File Name
set /p old=
echo Enter New Name
set /p new=
ren "%old%" "%new%"
echo Done
pause```

person Mark    schedule 30.10.2020    source источник
comment
Не могли бы вы добавить в свой пост два примера списков папок для пары воображаемых студентов (покажите список до и желаемый после). Включите все соответствующие пути к папкам и файлы, начиная с My Documents и ниже.   -  person jarmod    schedule 30.10.2020
comment
Математика A \ Jim Book \ Дополнение к книге 1 \ Addition Booklet.docx Math A \ Jim Book \ Book 2 Subtraction \ Subtraction Booklet.docx Math A \ Frank Sims \ Book 1 Addition \ Addition Booklet.docx Math A \ Frank Sims \ Book 2 Вычитание \ Вычитание Буклет.docx   -  person Mark    schedule 30.10.2020
comment
Итак, брошюру Фрэнка Сима с добавлением можно переименовать в Math A_Book 1_Frank Sims.docx?   -  person jarmod    schedule 30.10.2020
comment
Да, это все. Я также поместил это в основной пост, чтобы было легче увидеть. Впервые использую это   -  person Mark    schedule 30.10.2020
comment
PS Я бы рекомендовал заархивировать всю папку верхнего уровня и где-нибудь в надежном месте, прежде чем пробовать какие-либо предлагаемые решения. Я уверен, что ты все равно собирался.   -  person jarmod    schedule 30.10.2020
comment
Спасибо за это. Я пробовал запустить bat-файл на копии папки, но получаю. Система не может найти указанный файл.   -  person Mark    schedule 30.10.2020


Ответы (2)


Как упоминает @jarmod в комментариях: сохраните безопасную копию ваших исходных файлов, прежде чем запускать эту операцию! На всякий случай вам понадобится резервная копия.

Это должно сработать, если вы запустите его из основного каталога. Он будет перебирать все совпадающие файлы в подкаталогах и копировать в текущий (основной) каталог.

@echo off
Setlocal enabledelayedexpansion

Set "Pattern=\"
Set "Replace=_"
set "RemovePath=!CD:%Pattern%=%Replace%!_"

For /r %%# in ("*.doc?") Do (
    Set "File=%%~f#"
    set "trimfile=!File:%Pattern%=%Replace%!"
    set "trimfile=!trimfile:%RemovePath%=% %!"

    REM If you remove "echo" from the next line, the copy will happen
    echo copy "!File!" "!trimfile!"
)

Pause

Что оно делает:

  1. Устанавливает несколько шаблонов для замены. То есть вы хотите заменить обратную косую черту \ на подчеркивание _.
  2. Захватите текущий каталог, чтобы мы могли позже заменить его в имени файла.
  3. Переберите все совпадающие файлы, используя полный путь, и замените \ в пути на _.
  4. Удалите путь из результирующей строки, так как мы хотим только начать новое имя файла с именем каталога следующего уровня.
  5. Повторите команду, которая будет запущена после удаления ключевого слова echo. *

Примечание. Самая важная строка отключается командой echo для безопасного выполнения. Если вам это нравится, удалите слово echo, и начнется операция copy.

person Marc    schedule 30.10.2020
comment
Спасибо вам обоим за это. Я пробовал запустить bat-файл на копии папки, но получаю. Система не может найти указанный файл. - person Mark; 30.10.2020
comment
Укажите полный путь к одному из ваших файлов. Все, буква диска и все такое. Также укажите, как вы пытаетесь запустить то, что я предоставил. Я предполагаю, что вы копируете приведенный выше код в пакетный файл, сохраняете этот пакетный файл в основном каталоге в корне ваших файлов и запускаете его из командной строки. - person Marc; 30.10.2020
comment
D: \ mligh7 \ Мои документы \ 1. Class \ Class \ LSK \ Jim Book \ Book 1 WHS \ Safety Assessment 2020.V1.Final.docx Я пробовал запустить файл bat, находясь в папке LSK и папке Class, но все равно без разницы. Да, скопировал его в командный файл и из командной строки. Некоторые из моих студентов также делали странные вещи и добавляли (1) в имя файла, если это тоже имеет значение. - person Mark; 30.10.2020
comment
Я думаю, вам следует поместить несколько операторов echo после каждой строки в цикле, который регистрирует переменную, установленную в предыдущем операторе. Это единственный известный мне способ узнать, не сработает ли конкретное имя файла. Но я протестировал несколько странных без проблем. Вы не сказали, где в процессе вы получаете ошибку, поэтому я не могу сказать, выполняет ли он итерацию нескольких файлов или вообще ни одного файла перед ошибкой. Больше деталей лучше. - person Marc; 30.10.2020
comment
Set File =% ~ f # set trimfile =! File: \ = _! установите trimfile =! trimfile: D: _mligh7_My Documents_1. Class_LSK_ =! копировать файл! ! trimfile! Итак, что я вижу, он не попадает в подпапку, в которой он нуждается, он только доходит до папки, в которой он расположен. - person Mark; 01.11.2020

Переутомленный недооцененный учитель!

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
FOR /f "delims=" %%a IN ( 
 'dir /s /b /a-d "%sourcedir%\*.doc" "%sourcedir%\*.docx" '
 ) DO for %%w in ("%%~dpa.") do for %%g in ("%%~dpw.") do for %%q in ("%%~dpg.") do ECHO REN "%%a" "%%~nxq_%%~na_%%~nxg%%~xa"
)

GOTO :EOF

Вам нужно будет изменить настройку sourcedir в соответствии с вашими обстоятельствами. В листинге используется настройка, которая подходит моей системе.

Греческий?

Нет, санскрит.

Прежде всего, возьмите dir листинг в /b базовой форме, /s с подкаталогами, /a-d, но без совпадающих имен каталогов двух масок файлов.

Обработайте результирующий список, игнорируя разделители по умолчанию ("delims=") до %%a, затем возьмите Drive и Path %%a (%%~dpa) и добавьте ., которое оценивается как имя родительского каталога без обратной косой черты в конце. Похоже, это имя файла, поэтому %%~dpw - это имя-прародитель, а %%~dpq - имя-прапрадедушка.

И затем все, что нам нужно сделать, это переименовать имя файла в %%a в ggp-Name и eXtension (%%~nxq) подчеркивание имя исходного файла (%%~na) подчеркивание grandparent-Name и eXtension (%%~nxg) eXtension исходного файла (%%~xa)

Необходимые команды REN просто ECHO указаны в целях тестирования. Убедившись, что команды верны, измените ECHO REN на REN, чтобы фактически переименовать файлы.

Внимание: это однократная операция, если вам не нужны имена файлов вроде \Math A\Jim Book\Book 2 Subtraction\Math A_Math A_Subtraction Booklet_Jim Book_Jim Book.docx
затем \Math A\Jim Book\Book 2 Subtraction\Math A_Math A_Math A_Subtraction Booklet_Jim Book_Jim Book_Jim Book.docx
...

Чтобы запустить пакет, все, что вам нужно сделать, это выполнить 'd:\wherever\you put\thisbatch" или, если вы поместите thisbatch.bat в каталог, который является элементом вашего path, тогда будет достаточно thisbatch.

Если вы установите sourcedir на . (то есть на одну точку), тогда пакет будет выполняться из любого вашего текущего каталога.

person Magoo    schedule 30.10.2020