Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Пакетное переименование файлов (синхронизирование имён одного расширения с другим) (http://forum.oszone.net/showthread.php?t=201046)

19w85 03-03-2011 21:50 1626684

Пакетное переименование файлов (синхронизирование имён одного расширения с другим)
 
Имеется произвольный список файлов *.mkv
А также список допустим *.ac3

абв 1.mkv
абц2.mkv
...

test 1.ac3
test 34.ac3
...

Требуется 1-ый найденный ac3 переименовать, взяв имя из 1-ого найденного mkv, порядок сортировки обычный, соотвественно, должно стать:
test 1.ac3 ->абв 1.ac3
test 34.ac3->абц2.ac3

Дальше извлечения из mkv-файлов списка имен без расширения в txt-файл уйти мне не удалось:
Код:

For %%I In ("*.mkv") Do (echo %%~nI>>nameslist.txt)
Цикл, который пробежится по всем строчкам nameslist.txt я сделать могу
Цикл, который переименует каждый файл *.ac3 в какое-то конкретное имя, например, со счетчиком я тоже могу.
А не могу я совместить эти 2 цикла, чтобы для 1ого файла ac3 сопоставить 1ую строчку из nameslist.txt, для 2ого - 2ую строчку и т.д.

Вот тут (http://forum.oszone.net/thread-184481.html) похожая задача решалась, но более простая, т.к. исходное имя переименовываемого файла там конкретное, а не призвольное-полностью неизвестное как в моём случае.

Ivan Bardeen 04-03-2011 08:43 1626945

Количество файлов *.mkv и *.ac3 одинаковое?
Они все лежат в одной папке?

19w85 04-03-2011 08:50 1626947

Цитата:

Цитата Ivan Bardeen
Количество файлов *.mkv и *.ac3 одинаковое?
Они все лежат в одной папке? »

Да, в одной папке. Желательно учесть ситуацию при неодинаковом количестве файлов.

Ivan Bardeen 04-03-2011 09:35 1626965

Цитата:

Цитата 19w85
Желательно учесть ситуацию при неодинаковом количестве файлов. »

Как поступать в таком случае?

19w85 04-03-2011 09:43 1626971

Цитата:

Цитата Ivan Bardeen
Как поступать в таком случае? »

Да я честно говоря не вижу тут каких-либо альтернатив, чтобы было из чего выбирать:
1-ой вариант (с условными именами):
a.mkv, b.mkv, c.mkv
1.ac3, 2.ac3
3-его ac3-файла нету, переименовывать нечего - как тут по другому можно поступить, кроме пропуска?

2-ой вариант:
a.mkv, b.mkv
1.ac3, 2.ac3, 3.ac3
Имя для переименования 3его ac3-файла взять неоткуда, т.к. нет mkv - также кроме как пропустить тут делать ведь нечего...

Ivan Bardeen 04-03-2011 09:47 1626976

Цитата:

Цитата 19w85
Требуется 1-ый найденный ac3 переименовать, взяв имя из 1-ого найденного mkv, »

И еще вопрос, 1-ый найденный - это, как я понимаю сортировка по алфавиту?

19w85 04-03-2011 09:48 1626977

Цитата:

Цитата Ivan Bardeen
И еще вопрос, 1-ый найденный - это, как я понимаю сортировка по алфавиту? »

Да

19w85 09-03-2011 07:55 1630445

Вроде бы поставленная задача средней сложности...неужели никто ничего не подскажет?

SendMessage 09-03-2011 10:40 1630517

Видно после праздника голова не работает. Получилась такая ересь. :)
Но самое смешное - у меня работает. Если у Вас не будет - не удивлюсь.
Код:

@echo off

setlocal enabledelayedexpansion

set "SFileName=z:\sandbox\003\*.ac3"
set "DFileName=z:\sandbox\003\*.mkv"
set n=0

for /f "delims=" %%a in ('dir /a-d/b/oen "%SFileName%"') do (
  set /a n+=1
  set "arr=!arr!^ren "%%a" "^>!n!"/"
)

set n2=0

for /f "delims=" %%i in ('dir /a-d/b/oen "%DFileName%"') do (
  set /a n2+=1
  if !n2! LEQ n call set arr=%%arr:^>!n2!=%%~ni.ac3%%
)

set arr=%arr:/=^&%
2>nul (%arr:~,-1%)


19w85 09-03-2011 11:04 1630535

SendMessage,
Отлично, спасибо! У меня вроде тоже работает (естественно, в начало командника добавил cd /D "%~dp0" и удалил из кода z:\sandbox\003\ чтобы полностью соответствовало поставленной задаче)

А не могли бы рассказать принцип действия? И особенно прокомментировать, что именно происходит в выделенных частях в этих строках:
Код:

set "arr=!arr!^ren "%%a" "^>!n!"/"
if !n2! LEQ n call set arr=%%arr:^>!n2!=%%~ni.ac3%%
set arr=%arr:/=^&%
2>nul (%arr:~,-1%)


SendMessage 09-03-2011 11:35 1630563

Цитата:

Цитата 19w85
А не могли бы рассказать принцип действия? »

Принцип действия простой - создается массив команд REN. Ну а они переименовывают.
Теперь то, что у Вас выделено красным:
^ren - символ ^ ставится, чтобы cmd не принял это за команду, а просто как текст.
"%%a" "^>!n!"/" - ну первая часть - просто путь файла с расширением ac3, вторая - идентификатор для будущих действий. Примерно так это выглядит в виде текста:
ren "a.ac3" ">1"/. После второго прохода цикла - ren "a.ac3" ">1"/ren "b.ac3" ">2"/ ну и т.д.
%%arr:^>!n2!=%%~ni.ac3%% - замена счетчика на имя файла с расширением mkv. Где-то так: %%arr:>1=имяMKVфайла.ac3%%
:/=^& - замена символа / на &.
2>nul (%arr:~,-1%) - ну а это, собственно само переименование. 2>nul - не выводить сообщения об ошибках. %arr:~,-1% - массив получившихся команд REN. Без последнего символа. Выглядит примерно так:
ren "a.ac3" "имя1.ac3"&ren "b.ac3" "имя2.ac3"&ren "c.ac3" "имя3.ac3"

El Sanchez 09-03-2011 21:32 1630982

19w85, ересь №2 :), только покороче:
Код:

@Echo Off
Set Source=C:\Source

SetLocal
For /F "Tokens=1* Delims=:" %%A In ('Dir /B /A-D "%Source%\*.ac3"^|FindStr /N .') Do Set FN%%A=%%B
For /F "Tokens=1* Delims=:" %%A In ('Dir /B /A-D "%Source%\*.mkv"^|FindStr /N .') Do If Defined FN%%A Call Ren "%Source%\%%FN%%A%%" "%%~nB.ac3"
EndLocal


19w85 09-03-2011 23:21 1631060

El Sanchez,
Покороче - это отлично, спасибо! По этому коду даже вопросов нет, всё проще и понятнее. (я как раз в своих попытках и пытался реализовать именно такой способ через 'Set FN%%A=%%B' только ошибок много наделал, теперь смог увидеть, где именно, ещё раз спасибо) :)

dionus 04-10-2013 22:02 2228766

Цитата:

Имеется произвольный список файлов
Специально для подобных целей написал батник для пакетного переименования файлов по списку:
http://it.dnepro.org/2013/120.html


Время: 20:23.

Время: 20:23.
© OSzone.net 2001-