PDA

Показать полную графическую версию : Операция с именами файлов


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

rider42
08-12-2018, 10:30
Ещё раз здравствуйте. Это снова я :teeth:

В продолжении выше написанного - а как будет выглядеть код, если допустим исходных папок с файлами несколько? К примеру несколько папок с одинаковым количеством и последовательностью файлов и нужно так же последовательно попеременно переименовывать файлы в "11" в каждой папке - обрабатывать сторонними программами - назначать полученному файлу в итоговой папке имя файла из определенной исходной папки.

Заранее спасибо!

Iska
08-12-2018, 11:56
а как будет выглядеть код, если допустим исходных папок с файлами несколько? »
Оформляете основной код в виде процедуры и вызываете эту процедуру столько раз, сколько у Вас есть исходных каталогов, передавая ей потребные параметры, включая очередной исходный каталог.

alpap
08-12-2018, 14:45
@echo off
set "d=C:\papka"
set "ext=txt"
set n=10

for /d /r "%d%" %%a in (*) do (
setlocal
pushd "%%a"
for %%a in (*.%ext%) do set /a n+=1& call :# "%%a" "%%n%%%%~xa"
popd
endlocal
)
pause& exit

:#
ren "%~1" "%~2"
>"%~2" echo Операция с "%~2"
ren "%~2" "%~1"
exit /b

Busla
08-12-2018, 14:57
как будет выглядеть код, если допустим исходных папок с файлами несколько »
по уму, пишется скрипт умеющий обрабатывать единственный файл (а лучше - принимающий конвейер), и после уже штатными средствами он выполняется для списка, директории, поддерева каталогов и т.п.

примерно такой скрипт:
echo off
set programm1=echo executing first_programm.exe
set programm2=echo evecuting second_programm.exe

set targetdir=%1
set tempdir=%TEMP%\%~n0%RANDOM%
call :safetyExecute mkdir %tempdir%
if ERRORLEVEL 1 exit 1

FOR /F "tokens=1* delims=]" %%A IN ('FIND /N /V ""') DO (
call :process "%%~B" %*
)
call :safetyExecute rmdir /S /Q %tempdir%
if ERRORLEVEL 1 exit 3
goto :EOF

:process
set tempfile=%tempdir%\%RANDOM%%~x1
set targetfullname=%targetdir%\%~n1.mkv
call :safetyExecute mklink "%tempfile%" %1
if ERRORLEVEL 1 goto :eof
call :safetyExecute %programm1% /key1 %2 /key2 %tempfile% %targetfullname%
if ERRORLEVEL 1 goto :eof
call :safetyExecute %programm2% --key1 %2 --key2 %tempfile% %targetfullname%
if ERRORLEVEL 1 goto :eof
call :safetyExecute del %tempfile%
goto :eof


:safetyExecute
echo [running] %*
%*
if ERRORLEVEL 1 (
echo [error %ERORRLEVEL%] %*
exit 2
)
goto :EOF


запускать примерно так:
dir /s /b c:\dir1 e:\dir2 | videoprocess.bat c:\targetdir

я отказался от переименования в пользу создания символьных ссылок, т.к. в реалистичном workflow исходный файл это или torrent, который после переименования начнёт перекачиваться, или карта памяти из камеры, которая защищена от записи
а hardlink не работают с NAS, FAT и требую админских прав

megaloman
08-12-2018, 15:45
rider42, Оформляете основной код в виде процедуры и вызываете эту процедуру столько раз, сколько у Вас есть исходных каталогов, передавая ей потребные параметры, включая очередной исходный каталог. »
@Echo Off
cls
chcp 1251 >nul
Set "LogBat=%~dpnx0.log"
>"%LogBat%" Echo %Date% %Time%

Call :Process "Z:\Download\Video" "Z:\Download\!Vid2CHG" "mp4" "mkv"
Call :Process "Z:\Box_In\Download\Video" "Z:\Box_In\Download\!Vid2CHG" "mp4" "mkv"
Call :Process "Z:\Soft_In\Download\Video" "Z:\Soft_In\Download\!Vid2CHG" "mp4" "mkv"
pause
GoTo :Eof

:Process
Set "BoxIn=%~1"
Set "BoxOut=%~2"
Set "ExtIn=%~3"
Set "ExtOut=%~4"

If Not Exist "%BoxOut%" Md "%BoxOut%"

Set /A NNN=11

FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\*.%ExtIn%" /b /a:-d /O:D`) DO (

>>"%LogBat%" (Echo: &Echo === begin "%BoxIn%\%%f")

Call :MyMove "%BoxIn%\%%f" "%BoxIn%\%NNN%.%ExtIn%"
Del "%BoxOut%\%NNN%.%ExtOut%" >nul 2>&1

rem Обработка программами
Echo "%BoxIn%\%%f"
Echo "%BoxIn%\%NNN%.%ExtIn%"
Echo:
Copy "%BoxIn%\%NNN%.%ExtIn%" "%BoxOut%\%NNN%.%ExtOut%" >nul
rem ---------------------

Call :MyMove "%BoxIn%\%NNN%.%ExtIn%" "%BoxIn%\%%f"
Call :MyMove "%BoxOut%\%NNN%.%ExtOut%" "%BoxOut%\%%~nf.%ExtOut%"
)
GoTo :Eof

:MyMove
If Not Exist %1 (
>>"%LogBat%" Echo --- not found %1
Exit /B 2
)

>>"%LogBat%" 2>&1 Move /Y %1 %2
If Exist %2 (
>>"%LogBat%" Echo +++ success Move /Y %1 %2
) Else (
>>"%LogBat%" Echo --- failure Move /Y %1 %2
>>"%LogBat%" Echo --- failure Move /Y %1 %2
)
GoTo :Eof

rider42
08-12-2018, 20:52
как будет выглядеть код, если допустим исходных папок с файлами несколько »
Я неверное снова что-то сделал не так, но данный варианту меня не работает.

Суть такова:

В папке "d:\uTorrent\work\(WRKD)\LostFilm\" лежит главный файл, а в папке "d:\uTorrent\work\(WRKD)\LostFilm\aud\" дополнительный. В папке же "d:\uTorrent\work\(WRKD)\" должен оказаться итоговый файл после обработки с именем файла как в "d:\uTorrent\work\(WRKD)\LostFilm\"
@Echo Off
cls
chcp 1251 >nul
Set "LogBat=%~dpnx0.log"
>"%LogBat%" Echo %Date% %Time%

Call :Process "d:\uTorrent\work\(WRKD)\LostFilm" "d:\uTorrent\work\(WRKD)" "mkv" "mkv"
Call :Process "d:\uTorrent\work\(WRKD)\LostFilm\aud\" "d:\uTorrent\work\(WRKD)\LostFilm\Temp1" "mkv" "mkv"

pause
GoTo :Eof

:Process
Set "BoxIn=%~1"
Set "BoxOut=%~2"
Set "ExtIn=%~3"
Set "ExtOut=%~4"

If Not Exist "%BoxOut%" Md "%BoxOut%"

Set /A NNN=11

FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\*.%ExtIn%" /b /a:-d /O:D`) DO (

>>"%LogBat%" (Echo: &Echo === begin "%BoxIn%\%%f")

Call :MyMove "%BoxIn%\%%f" "%BoxIn%\%NNN%.%ExtIn%"
Del "%BoxOut%\%NNN%.%ExtOut%" >nul 2>&1

"C:/Soft/!Video/MKVtoolnix-29.0.0\mkvmerge.exe" --ui-language ru --output ^"D:\uTorrent\work\^(WRKD^)\11.mkv^" --language 0:eng --default-track 0:yes --language 1:eng --default-track 1:no --sub-charset 2:UTF-8 --language 2:eng ^"^(^" ^"D:\uTorrent\work\^(WRKD^)\LostFilm\11.mkv^" ^"^)^" --audio-tracks 1 --no-video --language 1:rus --track-name 1:LostFilm --default-track 1:yes --forced-track 1:yes --sync 1:-9250 ^"^(^" ^"D:\uTorrent\work\^(WRKD^)\LostFilm\aud\11.mkv^" ^"^)^" --track-order 0:0,1:1,0:1,0:2

Call :MyMove "%BoxIn%\%NNN%.%ExtIn%" "%BoxIn%\%%f"
Call :MyMove "%BoxOut%\%NNN%.%ExtOut%" "%BoxOut%\%%~nf.%ExtOut%"
)
GoTo :Eof

:MyMove
If Not Exist %1 (
>>"%LogBat%" Echo --- not found %1
Exit /B 2
)

>>"%LogBat%" 2>&1 Move /Y %1 %2
If Exist %2 (
>>"%LogBat%" Echo +++ success Move /Y %1 %2
) Else (
>>"%LogBat%" Echo --- failure Move /Y %1 %2
>>"%LogBat%" Echo --- failure Move /Y %1 %2
)
GoTo :Eof

rider42
08-12-2018, 21:20
Почему у Вас в вызове одинаковые расширения входного и выходного файла? »
В данном случае у всех файлов (исходных и итоговых) расширением является mkv




© OSzone.net 2001-2012