1 (изменено: Sundr, 2018-07-28 18:42:25)

Тема: CMD/BAT: Переименование файлов

Добрый день.

Прошу сделать два батника по переименованию аудио файлов.Батникам необходимо работать в любой директории.

1) Первый батник: В папке лежат шесть  аудио файлов, формата "wav". Эти шесть моно файлов соответсвуют многоканальным каналам и им присвоены названия по следующему шаблону:
[ Номер.Наименование канала.Сокращенная аббревиатура канала. Расширение файла. ]
1.Name channel.L.wav
2.Name channel.R.wav
3.Name channel.C.wav
4.Name channel.LFE.wav
5.Name channel.SL.wav
6.Name channel.SR.wav
Наименование каждого канала начинается с номера с точкой. Нумерация идет от 1 до 6. Цифры идут в таком формате : "1."  "2." "3." "4." "5." "6."
Батнику необходимо работать в любой директории и уметь переименовать  названия файлов чтобы удалялись все  цифры вместе с точкой из названий, впереди стоящие.После работы батника названия файлов будут выглядеть так:
Name channel.L.wav
Name channel.R.wav
Name channel.C.wav
Name channel.LFE.wav
Name channel.SL.wav
Name channel.SR.wav
Сами имена файлов не нужно менять, только удаляются цифры вместе с точкой.

Примечание: Могут быть также ситуации, что в папке будет лежать намного больше "wav" файлов , а не ровно шесть штук. Необходимо чтобы батник понимал такую ситуацию и брал в работу только файлы с аббревиатурой и игнорировал другие "wav" файлы .

2) Второй батник: В папке лежат восемь  аудио файлов, формата "wav". Эти восемь файлов могут начинаться в названии с номера, т.е. имея нумерацию от 1 до 8. Или совсем не иметь номера в названии. И так и так может быть. Наименование каналов(Name channel) может быть любым, а постоянным всегда остаются аббревиатуры в конце наименования.Перед аббревиатурой  также всегда идет точка. Ситуация аналогичная как в первом случае, здесь просто идет другой список аббревиатур.
Вот список всех аббревиатур: ".L", ".R", ".С", ".LFE", ".SL", ".SR", ".BL", ".BR"

Батнику необходимо работать в любой директории и уметь переименовать  названия только четырех файлов из этих восьми, в папке.Названия файлов какое бы не было остется, а меняется только аббревиатура у четырех файлов. Вот список четырех аббревиатур, которые надо переименовать:
"SL" переименовывается на  "LSS"
"SR" переименовывается на  "RSS"
"BL" переименовывается на  "LSR"
"BR" переименовывается на  "RSR"

Примечание: Могут быть также ситуации, что в папке будет лежать намного больше "wav" файлов , а не ровно восемь штук. Необходимо чтобы батник понимал такую ситуацию и брал в работу только файлы с аббревиатурами: ".SL", ".SR", ".BL", ".BR" и игнорировал другие "wav" файлы .


Цена: 600 руб за два батника.
Готов обсудить детали.

2

Re: CMD/BAT: Переименование файлов

А если я реализую Ваши задачи скриптом на AHK?

3

Re: CMD/BAT: Переименование файлов

Sundr пишет:

1) Первый батник:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
	`2^>nul dir /a:-d /b "1.*.L.wav"`
) do (
	set sName=%%~i
	echo Found first file [!sName!] in collection.
	
	set sPartName=!sName:.L.wav=!
	set sPartName=!sPartName:~2!
	echo Partial name is: [!sPartName!].
	
	set /a bExists = 1
	
	for %%j in ("2.:.R.wav" "3.:.C.wav" "4.:.LFE.wav" "5.:.SL.wav" "6.:.SR.wav") do (
		set sTemlateFileName=%%~j
		call set sFileName=!sTemlateFileName::=%%sPartName%%!
		
		if not exist "!sFileName!" (
			set /a bExists = 0
			echo Collection file [!sFileName!] not found.
		)
	)
	
	if !bExists! equ 1 (
		echo All collection files found.
		
		for %%j in ("1.:.L.wav" "2.:.R.wav" "3.:.C.wav" "4.:.LFE.wav" "5.:.SL.wav" "6.:.SR.wav") do (
			set sTemlateFileName=%%~j
			call set sFileName=!sTemlateFileName::=%%sPartName%%!
			echo Rename file [!sFileName!] into [!sFileName:~2!].
			ren "!sFileName!" "!sFileName:~2!"
		)
	) else (
		echo Not all collection files found.
	)
	
	echo.
)

endlocal
exit /b 0
Sundr пишет:

2) Второй батник:

@echo off
setlocal enableextensions enabledelayedexpansion

>nul 2>&1 dir /a:-d /b "*.L.wav"   && call :Unnamed
>nul 2>&1 dir /a:-d /b "1.*.L.wav" && call :Named

endlocal
exit /b 0

:Unnamed
	for /f "usebackq delims=" %%i in (
		`2^>nul dir /a:-d /b "*.L.wav"`
	) do (
		set sName=%%~i
		echo Found first file [!sName!] in collection.
		
		set sPartName=!sName:.L.wav=!
		echo Partial name is: [!sPartName!].
		
		set /a bExists = 1
		
		for %%j in (".R.wav" ".C.wav" ".LFE.wav" ".SL.wav" ".SR.wav" ".BL.wav", ".BR.wav") do if not exist "!sPartName!%%~j" (
			set /a bExists = 0
			echo Collection file [!sPartName!%%~j] not found.
		)
		
		if !bExists! equ 1 (
			echo All collection files found.
		
			echo Rename file [!sPartName!.SL.wav] into [!sPartName!.LSS.wav].
			ren "!sPartName!.SL.wav" "!sPartName!.LSS.wav".
			
			echo Rename file [!sPartName!.SR.wav] into [!sPartName!.RSS.wav].
			ren "!sPartName!.SR.wav" "!sPartName!.RSS.wav".
			
			echo Rename file [!sPartName!.BL.wav] into [!sPartName!.LSR.wav].
			ren "!sPartName!.BL.wav" "!sPartName!.LSR.wav".
			
			echo Rename file [!sPartName!.BR.wav] into [!sPartName!.RSR.wav].
			ren "!sPartName!.BR.wav" "!sPartName!.RSR.wav".
		) else (
			echo Not all collection files found.
		)
		
		echo.
	)

exit /b

:Named
	for /f "usebackq delims=" %%i in (
		`2^>nul dir /a:-d /b "1.*.L.wav"`
	) do (
		set sName=%%~i
		echo Found first file [!sName!] in collection.
	
		set sPartName=!sName:.L.wav=!
		set sPartName=!sPartName:~2!
		echo Partial name is: [!sPartName!].
	
		set /a bExists = 1
	
		for %%j in ("2.:.R.wav" "3.:.C.wav" "4.:.LFE.wav" "5.:.SL.wav" "6.:.SR.wav" "7.:.BL.wav", "8.:.BR.wav") do (
			set sTemlateFileName=%%~j
			call set sFileName=!sTemlateFileName::=%%sPartName%%!
		
			if not exist "!sFileName!" (
				set /a bExists = 0
				echo Collection file [!sFileName!] not found.
			)
		)
	
		if !bExists! equ 1 (
			echo All collection files found.
		
			echo Rename file [5.!sPartName!.SL.wav] into [5.!sPartName!.LSS.wav].
			ren "5.!sPartName!.SL.wav" "5.!sPartName!.LSS.wav".
			
			echo Rename file [6.!sPartName!.SR.wav] into [6.!sPartName!.RSS.wav].
			ren "6.!sPartName!.SR.wav" "6.!sPartName!.RSS.wav".
			
			echo Rename file [7.!sPartName!.BL.wav] into [7.!sPartName!.LSR.wav].
			ren "7.!sPartName!.BL.wav" "7.!sPartName!.LSR.wav".
			
			echo Rename file [8.!sPartName!.BR.wav] into [8.!sPartName!.RSR.wav].
			ren "8.!sPartName!.BR.wav" "8.!sPartName!.RSR.wav".
		) else (
			echo Not all collection files found.
		)
	
		echo.
	)

exit /b

Пробуйте.

4 (изменено: alexii, 2018-07-31 21:36:27)

Re: CMD/BAT: Переименование файлов

Удалено по просьбе автора темы.

5 (изменено: alexii, 2018-07-31 21:36:06)

Re: CMD/BAT: Переименование файлов

Удалено по просьбе автора темы.

6

Re: CMD/BAT: Переименование файлов

Продолжение эпопеи.

Я когда тестировал первые два батника, заметил что они срабатывают  по такому приципу,если в папке есть строго определеное количество файлов.
В первом батнике в папке должно быть четко шесть файлов и тогда батник сработает. Есть пожелание, а можно сделать так чтобы первый батник срабатывал и на меньшее количество файлов. Предположим в папке есть только 1-й канал, 3-й канал и 6-й. Тогда запустив батник, мы видим что во всех этих трех файлах удалились передние цифры. Сделайте пожалуйста правку на меньшее количество каналов.

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("1.*.L.wav" "2.*.R.wav" "3.*.C.wav" "4.*.LFE.wav" "5.*.SL.wav" "6.*.SR.wav") do (
	for /f "usebackq delims=" %%j in (
		`2^>nul dir /b /a:-d "%%~i"`
	) do (
		set sFileName=%%~j
		
		echo Rename file [!sFileName!] into [!sFileName:~2!].
		ren "!sFileName!" "!sFileName:~2!"
	)
)

endlocal
exit /b 0

И во втором батнике аналогичная ситуация. Батник срабатывает только если в папке есть четко восемь файлов. Если в папке хотябы одного не хватает, то уже батник не срабатывает. Сделайте пожалуйста здесь также правку и чтобы срабатывало переименование даже если в папке лежит только один файл из восьми всего.

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("*.SL.wav" "*.SR.wav" "*.BL.wav" "*.BR.wav") do (
	for /f "usebackq delims=" %%j in (
		`2^>nul dir /b /a:-d "%%~i"`
	) do (
		set sFileName=%%~j
		
		set sNewFileName=!sFileName:.SL.wav=.LSS.wav!
		set sNewFileName=!sNewFileName:.SR.wav=.RSS.wav!
		set sNewFileName=!sNewFileName:.BL.wav=.LSR.wav!
		set sNewFileName=!sNewFileName:.BR.wav=.RSR.wav!

		echo Rename file [!sFileName!] into [!sNewFileName!].
		ren "!sFileName!" "!sNewFileName!"
	)
)

endlocal
exit /b 0

7

Re: CMD/BAT: Переименование файлов

Новая инкарнация первого пакетного файла в соответствии с новыми пожеланиями:

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("1.*.L.wav" "2.*.R.wav" "3.*.C.wav" "4.*.LFE.wav" "5.*.SL.wav" "6.*.SR.wav" "7.*.BL.wav" "8.*.BR.wav" "5.*.LSS.wav" "6.*.RSS.wav" "7.*.LSR.wav" "8.*.RSR.wav") do (
	for /f "usebackq delims=" %%j in (
		`2^>nul dir /b /a:-d "%%~i"`
	) do (
		set sFileName=%%~j
		
		echo Rename file [!sFileName!] into [!sFileName:~2!].
		ren "!sFileName!" "!sFileName:~2!"
	)
)

endlocal
exit /b 0

8

Re: CMD/BAT: Переименование файлов

Продолжаем варить кашу из топора.

Пожалуйста поправьте еще и самый первый батник, который вы делали по дабавлению цифр. http://forum.script-coding.com/viewtopic.php?id=13971 Сейчас он проставляет цифры, только если в папке есть строго шесть файлов и они соответствуют аббревиатурам: "L", "R", "С", "LFE", "SL", "SR"  Сделайте пожалуйста на основе этого батника, новый для добавления цифр ,когда у нас лежат восемь файлов в папке.
Внесите пожалуйста правки , чтобы батник умел просталять цифры даже если меньше восьми файлов находятся в папке, хоть всего один. Нумерация каналов та же.
И второй момент нужно чтобы батник умел срабатывать на переименованные аббревиатуры, как вы это делали в случае с удалением цифр.
т.е. добавляется опять условие со второй версией наименованй аббревиатур на четыре канала, чтобы батник срабатывал в обоих случаях наименование аббревиатур,  т.е. SL=>будет LSS; SR=>будет RSS; BL=>LSR; BR=>RSR.

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("1:.L.wav" "2:.R.wav" "3:.C.wav" "4:.LFE.wav" "5:.SL.wav" "6:.SR.wav" "7:.BL.wav" "8:.BR.wav" "5:.LSS.wav" "6:.RSS.wav" "7:.LSR.wav" "8:.RSR.wav") do (
	set sVar=%%~i
	call :Rename "!sVar::=" "!"
)

endlocal
exit /b 0

:Rename
	for /f "usebackq delims=" %%i in (
		`2^>nul dir /a:-d /b "*%~2"`
	) do (
		set sFileName=%%~i
		
		if "!sFileName:~0,2!" neq "%~1." (
			echo Rename file [%%~i] into [%~1.%%~i].
			ren "%%~i" "%~1.%%~i"
		)
	)
	
	exit /b

9

Re: CMD/BAT: Переименование файлов

Из PM:

И последний штрих, пожалуйста сделайте батник объединяющий сразу две операции вместе, т.е. комбинированный вариант.
Соедините пожалуйста два батника в один, первый батник это будет последний вариант по добавлению цифр и одновременное переименование этих  файлов, где меняются аббревиатуры у четырех каналов:
SL=>будет LSS; SR=>будет RSS;BL=>LSR; BR=>RSR.
Нужно просто соединить их функционал в один батник.

«Горшочек, вари!»:

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("*.SL.wav" "*.SR.wav" "*.BL.wav" "*.BR.wav") do (
	for /f "usebackq delims=" %%j in (
		`2^>nul dir /b /a:-d "%%~i"`
	) do (
		set sFileName=%%~j
		
		set sNewFileName=!sFileName:.SL.wav=.LSS.wav!
		set sNewFileName=!sNewFileName:.SR.wav=.RSS.wav!
		set sNewFileName=!sNewFileName:.BL.wav=.LSR.wav!
		set sNewFileName=!sNewFileName:.BR.wav=.RSR.wav!

		echo Rename file [!sFileName!] into [!sNewFileName!].
		ren "!sFileName!" "!sNewFileName!"
	)
)

for %%i in ("1:.L.wav" "2:.R.wav" "3:.C.wav" "4:.LFE.wav" "5:.LSS.wav" "6:.RSS.wav" "7:.LSR.wav" "8:.RSR.wav") do (
	set sVar=%%~i
	call :Rename "!sVar::=" "!"
)

endlocal
exit /b 0

:Rename
	for /f "usebackq delims=" %%i in (
		`2^>nul dir /a:-d /b "*%~2"`
	) do (
		set sFileName=%%~i
		
		if "!sFileName:~0,2!" neq "%~1." (
			echo Rename file [%%~i] into [%~1.%%~i].
			ren "%%~i" "%~1.%%~i"
		)
	)
	
	exit /b