Search code examples
batch-file

How to combine batch files


I have 4 batch files I run for MKV files. The first renames all the files, the second removes any comments in all the files, the 3rd edits the "Title" in the metadata to match the filenames and the 4th creates a directory of each filename, then moves the mkvs into them.

All 4 files work perfectly but I'm trying to combine them into a single batch file. I've managed to do it, and it's not pretty, but it works. The problem is, when all the files are done, gone through all of the processes, the batch file won't end. It keeps restarting over and over.

Here is the combined batchfile...

@ECHO OFF
@echo Renaming Files...
pause
SETLOCAL EnableExtensions DisableDelayedExpansion
set "mkv=C:\Users\Immortalis\Downloads\-=UT=-\! SAVED DOWNLOADS\mkvtoolnix\mkvpropedit.exe"
pushd "."
FOR /f "delims=" %%G IN ('dir /a-d /b /s /o-n') DO (
   SET "_FFN=%%~fG"                                    File Full Name
   SET "Var=%%~nxG"                                    File Name + Extension
   call :renaming
)
popd
ENDLOCAL
goto :EOF

:renaming
   SET "Var=%Var:(1={1%"
   SET "Var=%Var:(2={2%"
   SET "Var=%Var:0)=0}%"
   SET "Var=%Var:1)=1}%"
   SET "Var=%Var:2)=2}%"
   SET "Var=%Var:3)=3}%"
   SET "Var=%Var:4)=4}%"
   SET "Var=%Var:5)=5}%"
   SET "Var=%Var:6)=6}%"
   SET "Var=%Var:7)=7}%"
   SET "Var=%Var:8)=8}%"
   SET "Var=%Var:9)=9}%"
   SET "Var=%Var:(Ur)=(U)%"
   SET "Var=%Var:(Unrated)=(U)%"
   SET "Var=%Var:.trim01=%"
   SET "Var=%Var:[DR]=[D]%"
   SET "Var=%Var:[WR]=[W]%"
   SET "Var=%Var:[HD]=[H]%"
   SET "Var=%Var:[BR]=[B]%"
   SET "Var=%Var:[s={s%"
   SET "Var=%Var:00]=00}%"
   SET "Var=%Var:01]=01}%"
   SET "Var=%Var:02]=02}%"
   SET "Var=%Var:03]=03}%"
   SET "Var=%Var:04]=04}%"
   SET "Var=%Var:05]=05}%"
   SET "Var=%Var:06]=06}%"
   SET "Var=%Var:07]=07}%"
   SET "Var=%Var:08]=08}%"
   SET "Var=%Var:09]=09}%"
   SET "Var=%Var:10]=10}%"
   SET "Var=%Var:11]=11}%"
   SET "Var=%Var:12]=12}%"
   SET "Var=%Var:13]=13}%"
   SET "Var=%Var:14]=14}%"
   SET "Var=%Var:15]=15}%"
   SET "Var=%Var:16]=16}%"
   SET "Var=%Var:17]=17}%"
   SET "Var=%Var:18]=18}%"
   SET "Var=%Var:19]=19}%"
   SET "Var=%Var:20]=20}%"
   SET "Var=%Var:21]=21}%"
   SET "Var=%Var:22]=22}%"
   SET "Var=%Var:23]=23}%"
   SET "Var=%Var:24]=24}%"
   SET "Var=%Var:25]=25}%"
   SET "Var=%Var:26]=26}%"
rename "%_FFN%" "%Var%"
@echo Removing Comments...
pause
for /R "." %%I in (*.mkv) do "%mkv%" "%%I" --tags all: -d title --delete-attachment 1
@echo Setting Title to filename...
pause
for /R "." %%I in (*.mkv) do "%mkv%" "%%I" --edit info --set title="%%~nI"
@echo Placing files in separate directories...
pause
 if not "%%~ni" == "organize" (
  md "%%~ni" && move "%%~i" "%%~ni"
 )
)
goto :EOF

:EOF
@echo Processes Complete!
pause

Solution

  • In general, if you want to combine your batch files into one you can use this structure (let's assume you have PartOne.cmd, PartTwo.cmd, PartThree.cmd):

    AllParts.cmd:

    @echo off
    SETLOCAL EnableExtensions DisableDelayedExpansion
    echo Start processing...
    
    REM Here is a good place for parameters used by all parts - Store them
    REM in environment variables to be used across the parts
    
    call :PartOne
    call :PartTwo
    call :PartThree
    goto :Done
    
    :PartOne
    REM ... your code of PartOne.cmd ...
    exit /b
    
    :PartTwo
    REM ... your code of PartTwo.cmd  ...
    exit /b
    
    :PartThree
    REM ... your code of PartThree.cmd  ...
    exit /b
    
    :Error
    ECHO Error occurred: %errormsg%. Exiting with code 1 ...
    ENDLOCAL
    EXIT 1
    
    :Done
    ENDLOCAL
    ECHO Processing done!
    EXIT 0
    

    Copy the parts of your cmd files into this single file and test it.

    Note:

    • The command exit /b makes sure that the code continues at the line following the call statement. Just using exit would end the batch file (which you don't want).
    • In the call command it is important to use the colon (:), without it call would look for an external command being available in the path and execute it, for example call calc.exe will open the Windows calculator.
    • It could be that you have conflicting command line parameters (i.e. you are using them in the various parts differently). Consolidate them and store them in environment variables at the top of your call chain. This might require some refactoring.
    • [Optional] If you want, you can end the application with exit 0 - this allows you to flag successful termination. In case of early exit (because of an error), you can use exit 1 which allows you to call the batch from another file or run a command and then check against errorlevel 1.
      The condition errorlevel 1 is true, if the last command has set any exit code above 0 (typically if it aborted abnormally with an error). You can then jump there via (for example)
      set errormsg=Cannot copy file somefile.txt
      copy C:\tmp\somefile.txt C:\Users\myUser\Documents\
      if errorlevel 1 goto :Error.
    • [Optional] If you want to auto-elevate your script, here is how you can do that.