バッチ スクリプトでは、ファイルを MKV に多重化するときにカバー JPG イメージを一致させることができません。

バッチ スクリプトでは、ファイルを MKV に多重化するときにカバー JPG イメージを一致させることができません。

コードを書きましたので、アーカイブに使用したいと思います。改善にご協力いただきありがとうございます。

ファイルが格納されているフォルダは次のとおりです(例):

フォルダーを取得しまし た/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 /Fwhere /r)すべてのファイルをリストして回避.mkvする.mkvtmpファイルfindstr /v

for /f tokens^=* %%A IN ('where /r . *.mkv^|%__AppDir__%findstr.exe/vei mkvtmp

3.// クレジットerrorlevelでループのリセットを開始します(call )フォロー

... ')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.この関数 (ラベル:^)) 内で、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置き換えてみてください。renmove /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"

追加リソース:

関連情報