
Я написал код и хочу использовать его для своего архива. Спасибо за помощь в его улучшении.
Папки, содержащие файлы, следующие (пример):
Есть папка /S01
, /s02
, /s0n
...
/S01/01.mkv, 02.mkv,..., cover.jpg
/S02/01.mkv, 02.mkv,..., cover.jpg
В каждой подпапке есть файл с именем cover.jpg
, который я хочу прикрепить ко всем файлам в этой папке, но не могу изменить свой код для правильной работы.
Написанный код не смог идентифицировать cover.jpg
в каждой папке.
Вот код:
@ECHO OFF
For /R %%A IN (*.mkv
) Do (
"C:/Program Files/MKVToolNix\mkvmerge.exe" -o "%%~dpnxAtmp" --no- ^
attachments --no-chapters --no-global-tags --no-subtitles --title ^"^" ^
--language 0:und --language 1:en --track-name 0: --track-name 1: "%%~fA" ^
--attachment-name cover.jpg --attachment-mime-type image/jpeg --attach-file ^
"%*cover.jpg"
if errorlevel 2 (
echo errors generated during remuxing, original file not deleted
) else if errorlevel 1 (
del/f "%%~fA" echo Warnings generated during remuxing to "%%~A", original file deleted
) else (
del/f "%%~fA" echo Successfully remuxed to "%%~A", original file deleted
) & for /R %%A IN (*.mkvtmp) do ren "%%~fA" "%**.mkv" & CLS
)
pause
решение1
@echo off && setlocal
cd /d "%~dp0" & title <nul & title .\%~nx0
for /f tokens^=* %%A IN ('where /r . *.mkv^|%__AppDir__%findstr.exe/vei mkvtmp
')Do (call ) &<con: "C:\Program Files\MKVToolNix\mkvmerge.exe" -o "%%~fAtmp" ^
--no-attachments --no-chapters --no-global-tags --no-subtitles --title ^"^" ^
--language 0:und --language 1:en --track-name 0: --track-name 1: "%%~dpnxA" ^
--attachment-name cover.jpg --attachment-mime-type image/jpeg --attach-file ^
"%%~dpAcover.jpg" & call %:^) %errorlevel% "%%~fA"
for /R %%A IN (*.mkvtmp)do >nul move /y "%%~fA" "%%~dpnA.mkv"
<con: endlocal && %__AppDir__%timeout.exe /t -1 && goto :EOF
%:^)
if %~1 equ 0 (
del /q /f "%~2" && echo[Successfully remuxed to "%~nx2", original file deleted
) else if %~1 equ 1 ( echo[errors generated during remuxing, original file not deleted
) else if %~1 equ 2 echo[Warnings generated during remuxing to "%~nx2", original file deleted
exit /b
1.Тебе нужноSETLOCAL
ErrorLevel
When run from a batch file, SETLOCAL will always set an ERRORLEVEL.
If given a valid argument or no arguments, a new environment is created %ERRORLEVEL% = 0
If bad parameters given, %ERRORLEVEL% = 1
2.Заменить for /R
на ( for /F
рекурсивно where /r
) список всех ваших файлов .mkv
избегать.mkvtmp
файл сfindstr /v
for /f tokens^=* %%A IN ('where /r . *.mkv^|%__AppDir__%findstr.exe/vei mkvtmp
3.Начните сброс цикла errorlevel
с (call )
// credit to@aschipfl
... ')Do (call ) &<con: ...
4.Реализуйте функцию, в которой errorlevel
в качестве параметра можно передать %~1 == %errorlevel%
текущий файл ( ) и ( %~2 == %%~fA
)
%:^)
if %~1 equ 0 (
...
) else if %~1 equ 1 ( ...
) else if %~1 equ 2 ...
exit /b
5.Внутри этой функции (label :^)
) пусть параметр errorlevel
/ %1
обрабатывается условными if else if else
условиями:
%:^)
if %~1 equ 0 (
del /q /f "%~2" && echo[Successfully remuxed to "%~nx2", original file deleted
) else if %~1 equ 1( echo[errors generated during remuxing, original file not deleted
) else if %~1 equ 2 echo[Warnings generated during remuxing to "%~nx2", original file deleted
exit /b
Наблюд.: 1Замените ваш код "%*cover.jpg"
на "%%~dpAcover.jpg"
цикл for /f (or /R)
, и mkvmerge.exe
, к сожалению, они не будут переводить или выбирать файл на основе этих строк.%*cover.jpg
:
Наблюд.: 2Последняя команда ( ren
) не заменит существующий файл, вы можете попробовать заменить ren
его на move /y
, используя имя цели"%**.mkv" "%%~dpnA.mkv"
for /R %%A IN (*.mkvtmp) do ren "%%~fA" "%**.mkv"
for /R %%A IN (*.mkvtmp)do >nul move /y "%%~fA" "%%~dpnA.mkv"
Дополнительные ресурсы: