Войти

Показать полную графическую версию : [решено] Помощь с написанием Bat. Переименование файлов в папке с условием.


Страниц : [1] 2

dedylka
12-03-2019, 18:53
Приветствую вас, гуру сообщество)
Прошу помощи в написании пакетного файла, если таковой возможно написать.

условия задачи следующие:
есть две сетевые папки "А" и "B"
в папку "A" кладут n-ое кол-во файлов с расширением .mp3 в папке "B" лежит n-ое кол-во файлов с расширением .mp4
задача:
по запуску пакетного файла смотреть на имена .mp3 файлов в папке "A" и переименовать файлы .mp4 в папке "B" в соответствии с именами в "A", не трогая при этом расширение.


Пример: положили в папку "А" - 3 файла с именами 1.mp3, 2.mp3, 3.mp3.
в папке "B" лежат файлы 10.mp4, 12.mp4, 16.mp4, 20.mp4, 25.mp4
Запускаем пакетный файл и получаем в папке "B" файлы с именами 1.mp4, 2.mp4, 3.mp4, 20.mp4, 25.mp4
Содержимое файлов mp4. абсолютно одинаковое, поэтому не важно в какой последовательности они будут переименованы.
В папку "A" могут положить больше файлов чем есть в папке "B", в таком случае переименование идет пока не закончатся файлы в папке "B".

Iska
12-03-2019, 19:10
Запускаем пакетный файл и получаем в папке "B" файлы с именами 1.mp4, 2.mp4, 3.mp4, 20.mp4, 25.mp4
Содержимое файлов mp4. абсолютно одинаковое, поэтому не важно в какой последовательности они будут переименованы. »
И по какому принципу устанавливать соответствие между файлами в A и B?

dedylka
12-03-2019, 19:34
А что вы имеете ввиду под соответствием?

какой файл mp3 в "А" соответствует файлу mp4 в "B"? это не важно, как я написал, все файлы mp4 одинаковые. Главное, чтобы в "B" по итогу были файлы с такими же именами, как и в "A", кроме расширения.

Iska
12-03-2019, 19:51
Тогда зачем их там делать несколько штук? Или больше, чем есть mp3-файлов? Пусть один и будет.

На WSH:
Option Explicit

Dim strSourceFolder
Dim strDestFolder

Dim objFSO
Dim objFile
Dim objFile2
Dim boolFound


strSourceFolder = "C:\Мои проекты\0252\A"
strDestFolder = "C:\Мои проекты\0252\B"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FolderExists(strSourceFolder) Then
If objFSO.FolderExists(strSourceFolder) Then
boolFound = False

For Each objFile2 In objFSO.GetFolder(strDestFolder).Files
If StrComp(objFSO.GetExtensionName(objFile2.Name), "mp4", 0) = 0 Then
boolFound = True

Exit For
End If
Next

If boolFound Then
boolFound = False

For Each objFile In objFSO.GetFolder(strSourceFolder).Files
If StrComp(objFSO.GetExtensionName(objFile.Name), "mp3", 0) = 0 Then
boolFound = True
objFile2.Copy objFSO.BuildPath(objFile2.ParentFolder, objFSO.GetBaseName(objFile.Name) & "." & objFSO.GetExtensionName(objFile2)), True
End If
Next

If boolFound Then
objFile2.Delete True
End If
Else
WScript.Echo "Need at least one mp4 file in destination folder [" & strDestFolder & "]."
WScript.Quit 3
End If
Else
WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
WScript.Quit 2
End If
Else
WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0

Может, лучше опишете саму задачу?

dedylka
13-03-2019, 15:43
Может, лучше опишете саму задачу? »


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

На WSH »

Простите, я не настоящий сварщик( Чтобы запустить этот скрипт нужно дополнительное ПО?

Iska
13-03-2019, 17:15
Чтобы запустить этот скрипт нужно дополнительное ПО? »
Нет. Сохранить в файл с расширением .vbs и запустить.

dedylka, вопрос по:
некоторая часть mp4 файлов одинаковая, »
А какая? Вообще, по уму, при одинаковости файлов, я бы даже не копии делал, а жёсткие ссылки на оригинал создавал, которые не занимают места на диске. Но тут уже, наверное, PowerShell будет потребен.

alpap
13-03-2019, 20:58
@echo off
set "dirA=A"
set "dirB=B"

setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /a-d/b "%dirA%\*"') do set /a "n+=1,nx=n+1,x=0"& set "c!n!=%%~na"
for /f "delims=" %%a in ('dir /a-d/b "%dirB%\*"') do set /a m+=1& set "l!m!=%%a"& call :# "%%l!m!%%" "%%c!m!%%" "%dirA%" "%dirB%"
endlocal
pause& exit

:#
if not "%~2"=="" (set "z=%~2") else (set /a x+=1& if not !x!==%nx% (call set "z=%%c!x!%%") else (set /a x=0& goto #))
pushd "%~4"
if not exist "%z%%~x1" ren "%~1" "%z%%~x1"
popd
exit /b


если стр.14 изменить так

if not exist "%~n1_%z%%~x1" ren "%~1" "%~n1_%z%%~x1"

код будет переименовывать файлы в "B" именами файлов из "A" по кругу вот так
156828

dedylka
14-03-2019, 12:49
А какая? »

совсем небольшая, буквально капля в море, но требующая внимания, поэтому хочется этот процесс автоматизировать.


Нет. Сохранить в файл с расширением .vbs и запустить. »

спасибо большое, я протестировал скрипт, но он у меня отрабатывает немного некорректно(
он переименовывает первый файл, а дальше видимо копирует его столько раз сколько файлов в папке A и называет нужными именами, при этом остальные файлы в папке B, которые не были переименованы просто оставляет.
Таким образом папка B очень скоро будет завалена файлами(

R.i.m.s.k.y.
14-03-2019, 15:14
помогите, пожалуйста, с батником для переименования

Суть: нужно перекодировать dts в ас3
из dts вытаскиваем wav программой eac3to, она выдает файлы вида
2eng.C.wav
2eng.L.wav
2eng.LFE.wav
2eng.R.wav
2eng.SL.wav
2eng.SR.wav
а программа кодировщик хочет
2eng C.wav
2eng L.wav
2eng LFE.wav
2eng R.wav
2eng Ls.wav
2eng Rs.wav
т.е. после 2eng вместо точки поставить пробел и два файла переименовать:
2eng.SL.wav -> 2eng Ls.wav
2eng.SR.wav -> 2eng Rs.wav

имена вавок 2eng могут быть произвольными (с точками и пробелами), но концовка всегда .C .L .R .SL .SR

F1!

megaloman
14-03-2019, 15:21
dedylka, Попробуйте. Пути пропишИте свои без \ на конце @Echo Off
Set "FMP3=Z:\Box_In"
Set "EMP3=mp3"

Set "FMP4=Z:\Soft_In"
Set "EMP4=mp4"

Set /A N=1000000
FOR %%f IN ("%FMP4%\*.%EMP4%") DO Ren "%%f" "~%%~nxf"
FOR %%f IN ("%FMP4%\*.%EMP4%") DO Set /A N+=1 &Call Ren "%%f" "MP4@%%N%%.%EMP4%"

Set /A N=1000000
FOR %%f IN ("%FMP3%\*.%EMP3%") DO Set /A N+=1 &>nul 2>&1 Call Ren "%FMP4%\MP4@%%N%%.%EMP4%" "%%~nf.%EMP4%"
GoTo :Eof

megaloman
14-03-2019, 16:46
R.i.m.s.k.y., @Echo Off
Set "In=Z:\Soft_In"
Set InE=".C.wav" ".L.wav" ".R.wav" ".SL.wav" ".SR.wav"
Set OutE=" C.wav" " L.wav" " R.wav" " Ls.wav" " Rs.wav"

Set /A N=1000
FOR %%f IN (%InE%) DO Set /A N+=1 &Call Set "In@%%N%%=%%~f"

Set /A NN=%N%
Set /A N=1000
FOR %%f IN (%OutE%) DO Set /A N+=1 &Call Set "Out@%%N%%=%%~f"

For /L %%i In (1001,1,%NN%) DO Call :MyRen "%In%" "%%In@%%i%%" "%%Out@%%i%%"
GoTo :Eof

:MyRen
FOR %%f IN ("%~1\*%~2") DO (
Set "Rep=%%~nxf~~"
>nul Call Move /Y "%%f" "%~1\%%Rep:%~2~~=%~3%%"
)
GoTo :EofНарисуйте свой путь вместо моего Set "In=Z:\Soft_In"

R.i.m.s.k.y.
14-03-2019, 16:53
megaloman,
1 можно пояснить как оно работает, set еще понятно, но в циклах In@%%N%%=%%~f и подобное это просто brainfuck какой-то
2 а можно натравить на папку, т.е. Set "In=Z:\Soft_In" передать через контекстное меню имя папки (т.е. eac3to демуксит все дорожки в папку, я этот батник кладу в sendto, потом на папке с вавками делаю ПКМ-отправить-этотбатник). Просто при массовой обработке и перекодировании (особенно сериалов) на каждый эпизод своя папка, эпизодов 12, сезонов 3-5 и получается 36-60 раз надо править Set "In=Z:\Soft_In"

megaloman
14-03-2019, 17:24
@Echo Off
If "%~1"=="" (
Echo "%~dpnx0" sterted without argument &Echo.
Pause
Exit /B 2
)
Set "In=%~1"
If "%In:~-1%"=="\" Set "In=%In:~0,-1%"

Set InE=".C.wav" ".L.wav" ".R.wav" ".SL.wav" ".SR.wav"
Set OutE=" C.wav" " L.wav" " R.wav" " Ls.wav" " Rs.wav"

Set /A N=1000
FOR %%f IN (%InE%) DO Set /A N+=1 &Call Set "In@%%N%%=%%~f"

Set /A NN=%N%
Set /A N=1000
FOR %%f IN (%OutE%) DO Set /A N+=1 &Call Set "Out@%%N%%=%%~f"

For /L %%i In (1001,1,%NN%) DO Call :MyRen "%In%" "%%In@%%i%%" "%%Out@%%i%%"
GoTo :Eof

:MyRen
FOR %%f IN ("%~1\*%~2") DO (
Set "Rep=%%~nxf~~"
>nul Call Move /Y "%%f" "%~1\%%Rep:%~2~~=%~3%%"
)
GoTo :EofСделайте, например, на рабочем столе значок на батник, и таскайте на него нужную папку в проводнике.
В цикл помещен список для замены ".C.wav" ".L.wav" ".R.wav" ".SL.wav" ".SR.wav"
В цикле элементы списка присваиваются переменным In@10001, In@10002, In@10003 ...

Set /A N=1000
FOR %%f IN (%InE%) DO Set /A N+=1 &Call Set "In@%%N%%=%%~f"

Аналогично Out@10001, Out@10002, Out@10003 ...
В NN сохраняем максимальный номер, чтобы потом в цикле перебрать все переменные:
что заменяем - на что заменяем
при вызове функции переименования

megaloman
14-03-2019, 18:08
R.i.m.s.k.y., Просто при массовой обработке и перекодировании (особенно сериалов) на каждый эпизод своя папка, эпизодов 12, сезонов 3-5 и получается 36-60 раз надо править »Подозреваю, есть папка, допустим, СЕРИАЛ. В ней куча папок СЕЗОНЫ, в них еще куча Эпизодов.
@Echo Off
If "%~1"=="" (
Echo "%~dpnx0" sterted without argument &Echo.
Pause
Exit /B 2
)
Set "In=%~1"
If "%In:~-1%"=="\" Set "In=%In:~0,-1%"

Set InE=".C.wav" ".L.wav" ".R.wav" ".SL.wav" ".SR.wav" ".LFE.wav"
Set OutE=" C.wav" " L.wav" " R.wav" " Ls.wav" " Rs.wav" " LFE.wav"

Set /A N=1000
FOR %%f IN (%InE%) DO Set /A N+=1 &Call Set "In@%%N%%=%%~f"

Set /A NN=%N%
Set /A N=1000
FOR %%f IN (%OutE%) DO Set /A N+=1 &Call Set "Out@%%N%%=%%~f"

For /L %%i In (1001,1,%NN%) DO Call :MyRen "%In%" "%%In@%%i%%" "%%Out@%%i%%"
GoTo :Eof

:MyRen
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%~1\*%~2" /b /s /A:-D`) DO (
Set "Rep=%%~nxf~~"
>nul Call Move /Y "%%f" "%%~dpf%%Rep:%~2~~=%~3%%"
)
GoTo :Eof

dedylka
14-03-2019, 18:10
dedylka, Попробуйте. Пути пропишИте свои без \ на конце »


работает, спасибо!

Iska
14-03-2019, 20:04
он переименовывает первый файл, а дальше видимо копирует его столько раз сколько файлов в папке A и называет нужными именами, при этом остальные файлы в папке B, которые не были переименованы просто оставляет. »
Вы, видимо, не читали описание, которое я оставил. Скрипт берёт первый же найденный файл mp4 и копирует его в файлы, одноимённые с mp3.

R.i.m.s.k.y.
15-03-2019, 09:59
Подозреваю, есть папка, допустим, СЕРИАЛ. В ней куча папок СЕЗОНЫ, в них еще куча Эпизодов. »
верно
\сериал\сезон\эпизод\номер дорожки\*.wav

Вот вариант, тянИте папку СЕРИАЛ на батник, и не надо 60 раз напрягать усталость.
Обработаются все папки »
барзо дзинкуе!
батник кинул в sendto папку, по папке ПКМ - отправить на этот батник - отработало! только .LFE не переименовалось
дописал LFE
Set InE=".LFE.wav" ".C.wav" ".L.wav" ".R.wav" ".SL.wav" ".SR.wav"
Set OutE=" LFE.wav" " C.wav" " L.wav" " R.wav" " Ls.wav" " Rs.wav"

работает!
можно я этот скрипт запощу на рутракер в тему по обработке звука?

Iska
15-03-2019, 10:23
можно я этот скрипт запощу на рутракер в тему по обработке звука? »
Разумеется, можете. Авторство ежели подменять — вот это плохо, а способствовать распространению знаний — почему нет?! Можете там и ссылку на Ваше первое сообщение по данному вопросу в этой теме приложить.

R.i.m.s.k.y.
15-03-2019, 10:34
megaloman, подправьте, пожалуйста, батник
Set InE=".LFE.wav" ".C.wav" ".L.wav" ".R.wav" ".SL.wav" ".SR.wav"
Set OutE=" LFE.wav" " C.wav" " L.wav" " R.wav" " Ls.wav" " Rs.wav"
я дам ссылку на сообщение

R.i.m.s.k.y.
15-03-2019, 10:43
Что не так? »
я ошибся в начале и забыл указать еще .LFE, я указал 5 файлов с концовками .C .L .R .SL .SR, и нужно было еще указать шестой файл с концовкой .LFE
Если давать ссылку на решение то оно должно быть полным
Извините за мою невнимательность и спасибо Вам за решение!




© OSzone.net 2001-2012