I have a problem with a .bat script called "ProcessMKV_EngAud_EngSub.bat" that utilizes MKVToolNix on Windows 10. This is the script:

@echo off
setlocal enabledelayedexpansion

REM ===========================
REM Configuration
REM ===========================

REM Destination directory where processed files will be saved
set "DEST_DIR=D:\Video\MKVConvert"

REM Path to the mkvmerge executable
set "MKVMERGE=C:\Program Files\MKVToolNix\mkvmerge.exe"

REM ===========================
REM Setup
REM ===========================

REM Create destination directory if it does not already exist
if not exist "%DEST_DIR%" (
mkdir "%DEST_DIR%"
)

REM ===========================
REM Processing
REM ===========================

REM Loop through each MKV file in the current directory
for %%a in (*.mkv) do (
REM Get the base name of the file without extension
set "FILE_NAME=%%~na"

REM Define the output filename
set "OUTPUT_FILE=%DEST_DIR%\%%~na.mkv"

REM Check if the output file already exists
if exist "!OUTPUT_FILE!" (
    echo Warning: Output file "!OUTPUT_FILE!" already exists. Skipping...
) else (
    REM Display a message indicating processing
    echo Processing: %%~nxa

    REM Execute mkvmerge to process the file
    "%MKVMERGE%" ^
        --ui-language en ^
        --priority highest ^
        --video-tracks 0 ^
        --audio-tracks 1 ^
        --subtitle-tracks 2 ^
        --no-attachments ^
        --no-global-tags ^
        --no-track-tags ^
        --no-chapters ^
        --language 0:en ^
        --track-name 0: ^
        --default-track-flag 0:yes ^
        --language 1:en ^
        --track-name 1: ^
        --default-track-flag 1:yes ^
        --sub-charset 2:UTF-8 ^
        --language 2:en ^
        --track-name 2: ^
        --default-track-flag 2:yes ^
        --title "" ^
        --track-order 0:0,0:1,0:2 ^
        --output "!OUTPUT_FILE!" ^
        "%%~fa"

    REM Check if the processing was successful
    if !errorlevel! equ 0 (
        echo Successfully processed %%~nxa and saved as !OUTPUT_FILE!
    ) else (
        echo Error: Failed to process %%~nxa. Please check the input file and try again.
    )
)

)

REM ===========================
REM Completion Message
REM ===========================

REM Display a completion message for processing
echo.
echo All MKV files have been processed and saved in %DEST_DIR%.

REM Pause the script to allow the user to see the output
pause

Here are the files it's supposed to run through:

The Cleveland Show (2009) - S02E02 - Cleveland Live!.mkv
The Cleveland Show (2009) - S02E09 - Beer Walk!.mkv
The Cleveland Show (2009) - S03E02 - The Hurricane!.mkv
The Cleveland Show (2009) - S03E16 - Frapp Attack!.mkv
The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins!.mkv
The Cleveland Show (2009) - S04E23 - Wheel! Of! Family!.mkv

Here is the output in the terminal once the script has been ran:

Processing: The Cleveland Show (2009) - S02E02 - Cleveland Live.mkv
mkvmerge v86.0 ('Winter') 64-bit
Error: The file 'D:\Video\The Cleveland Show (2009) - S02E02 - Cleveland Live.mkv' could not be opened for reading: open file error.
Error: Failed to process The Cleveland Show (2009) - S02E02 - Cleveland Live.mkv. Please check the input file and try again.
Processing: The Cleveland Show (2009) - S02E09 - Beer Walk.mkv
mkvmerge v86.0 ('Winter') 64-bit
Error: The file 'D:\Video\The Cleveland Show (2009) - S02E09 - Beer Walk.mkv' could not be opened for reading: open file error.
Error: Failed to process The Cleveland Show (2009) - S02E09 - Beer Walk.mkv. Please check the input file and try again.
Processing: The Cleveland Show (2009) - S03E02 - The Hurricane.mkv
mkvmerge v86.0 ('Winter') 64-bit
Error: The file 'D:\Video\The Cleveland Show (2009) - S03E02 - The Hurricane.mkv' could not be opened for reading: open file error.
Error: Failed to process The Cleveland Show (2009) - S03E02 - The Hurricane.mkv. Please check the input file and try again.
Processing: The Cleveland Show (2009) - S03E16 - Frapp Attack.mkv
mkvmerge v86.0 ('Winter') 64-bit
Error: The file 'D:\Video\The Cleveland Show (2009) - S03E16 - Frapp Attack.mkv' could not be opened for reading: open file error.
Error: Failed to process The Cleveland Show (2009) - S03E16 - Frapp Attack.mkv. Please check the input file and try again.
Processing: The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins.mkv
mkvmerge v86.0 ('Winter') 64-bit
Error: The file 'D:\Video\The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins.mkv' could not be opened for reading: open file error.
Error: Failed to process The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins.mkv. Please check the input file and try again.
Processing: The Cleveland Show (2009) - S04E23 - Wheel Family.mkv
mkvmerge v86.0 ('Winter') 64-bit
Error: The file 'D:\Video\The Cleveland Show (2009) - S04E23 - Wheel Family.mkv' could not be opened for reading: open file error.
Error: Failed to process The Cleveland Show (2009) - S04E23 - Wheel Family.mkv. Please check the input file and try again.

All MKV files have been processed and saved in D:\Video\MKVConvert.
Press any key to continue . . .

However, if I remove all the exclamation points ("!") from the filename, so that the files look like this:

The Cleveland Show (2009) - S02E02 - Cleveland Live.mkv
The Cleveland Show (2009) - S02E09 - Beer Walk.mkv
The Cleveland Show (2009) - S03E02 - The Hurricane.mkv
The Cleveland Show (2009) - S03E16 - Frapp Attack.mkv
The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins.mkv
The Cleveland Show (2009) - S04E23 - Wheel Of Family.mkv

Then the script has absolutely no issues at all and the output in the terminal once the script has been ran is this:

Processing: The Cleveland Show (2009) - S02E02 - Cleveland Live.mkv
mkvmerge v86.0 ('Winter') 64-bit
'D:\Video\The Cleveland Show (2009) - S02E02 - Cleveland Live.mkv': Using the demultiplexer for the format 'Matroska'.
'D:\Video\The Cleveland Show (2009) - S02E02 - Cleveland Live.mkv' track 0: Using the output module for the format 'HEVC/H.265'.
'D:\Video\The Cleveland Show (2009) - S02E02 - Cleveland Live.mkv' track 1: Using the output module for the format 'AAC'.
Warning: 'D:\Video\The Cleveland Show (2009) - S02E02 - Cleveland Live.mkv': A track with the ID 2 was requested but not found in the file. The corresponding option will be ignored.
The file 'D:\Video\MKVConvert\The Cleveland Show (2009) - S02E02 - Cleveland Live.mkv' has been opened for writing.
The cue entries (the index) are being written...
Multiplexing took 2 seconds.
Error: Failed to process The Cleveland Show (2009) - S02E02 - Cleveland Live.mkv. Please check the input file and try again.
Processing: The Cleveland Show (2009) - S02E09 - Beer Walk.mkv
mkvmerge v86.0 ('Winter') 64-bit
'D:\Video\The Cleveland Show (2009) - S02E09 - Beer Walk.mkv': Using the demultiplexer for the format 'Matroska'.
'D:\Video\The Cleveland Show (2009) - S02E09 - Beer Walk.mkv' track 0: Using the output module for the format 'HEVC/H.265'.
'D:\Video\The Cleveland Show (2009) - S02E09 - Beer Walk.mkv' track 1: Using the output module for the format 'AAC'.
Warning: 'D:\Video\The Cleveland Show (2009) - S02E09 - Beer Walk.mkv': A track with the ID 2 was requested but not found in the file. The corresponding option will be ignored.
The file 'D:\Video\MKVConvert\The Cleveland Show (2009) - S02E09 - Beer Walk.mkv' has been opened for writing.
The cue entries (the index) are being written...
Multiplexing took 2 seconds.
Error: Failed to process The Cleveland Show (2009) - S02E09 - Beer Walk.mkv. Please check the input file and try again.
Processing: The Cleveland Show (2009) - S03E02 - The Hurricane.mkv
mkvmerge v86.0 ('Winter') 64-bit
'D:\Video\The Cleveland Show (2009) - S03E02 - The Hurricane.mkv': Using the demultiplexer for the format 'Matroska'.
'D:\Video\The Cleveland Show (2009) - S03E02 - The Hurricane.mkv' track 0: Using the output module for the format 'HEVC/H.265'.
'D:\Video\The Cleveland Show (2009) - S03E02 - The Hurricane.mkv' track 1: Using the output module for the format 'AAC'.
Warning: 'D:\Video\The Cleveland Show (2009) - S03E02 - The Hurricane.mkv': A track with the ID 2 was requested but not found in the file. The corresponding option will be ignored.
The file 'D:\Video\MKVConvert\The Cleveland Show (2009) - S03E02 - The Hurricane.mkv' has been opened for writing.
The cue entries (the index) are being written...
Multiplexing took 2 seconds.
Error: Failed to process The Cleveland Show (2009) - S03E02 - The Hurricane.mkv. Please check the input file and try again.
Processing: The Cleveland Show (2009) - S03E16 - Frapp Attack.mkv
mkvmerge v86.0 ('Winter') 64-bit
'D:\Video\The Cleveland Show (2009) - S03E16 - Frapp Attack.mkv': Using the demultiplexer for the format 'Matroska'.
'D:\Video\The Cleveland Show (2009) - S03E16 - Frapp Attack.mkv' track 0: Using the output module for the format 'HEVC/H.265'.
'D:\Video\The Cleveland Show (2009) - S03E16 - Frapp Attack.mkv' track 1: Using the output module for the format 'AAC'.
Warning: 'D:\Video\The Cleveland Show (2009) - S03E16 - Frapp Attack.mkv': A track with the ID 2 was requested but not found in the file. The corresponding option will be ignored.
The file 'D:\Video\MKVConvert\The Cleveland Show (2009) - S03E16 - Frapp Attack.mkv' has been opened for writing.
The cue entries (the index) are being written...
Multiplexing took 2 seconds.
Error: Failed to process The Cleveland Show (2009) - S03E16 - Frapp Attack.mkv. Please check the input file and try again.
Processing: The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins.mkv
mkvmerge v86.0 ('Winter') 64-bit
'D:\Video\The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins.mkv': Using the demultiplexer for the format 'Matroska'.
'D:\Video\The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins.mkv' track 0: Using the output module for the format 'HEVC/H.265'.
'D:\Video\The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins.mkv' track 1: Using the output module for the format 'AAC'.
Warning: 'D:\Video\The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins.mkv': A track with the ID 2 was requested but not found in the file. The corresponding option will be ignored.
The file 'D:\Video\MKVConvert\The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins.mkv' has been opened for writing.
The cue entries (the index) are being written...
Multiplexing took 2 seconds.
Error: Failed to process The Cleveland Show (2009) - S04E12 - Pins, Spins and Fins.mkv. Please check the input file and try again.
Processing: The Cleveland Show (2009) - S04E23 - Wheel Of Family.mkv
mkvmerge v86.0 ('Winter') 64-bit
'D:\Video\The Cleveland Show (2009) - S04E23 - Wheel Of Family.mkv': Using the demultiplexer for the format 'Matroska'.
'D:\Video\The Cleveland Show (2009) - S04E23 - Wheel Of Family.mkv' track 0: Using the output module for the format 'HEVC/H.265'.
'D:\Video\The Cleveland Show (2009) - S04E23 - Wheel Of Family.mkv' track 1: Using the output module for the format 'AAC'.
Warning: 'D:\Video\The Cleveland Show (2009) - S04E23 - Wheel Of Family.mkv': A track with the ID 2 was requested but not found in the file. The corresponding option will be ignored.
The file 'D:\Video\MKVConvert\The Cleveland Show (2009) - S04E23 - Wheel Of Family.mkv' has been opened for writing.
The cue entries (the index) are being written...
Multiplexing took 2 seconds.
Error: Failed to process The Cleveland Show (2009) - S04E23 - Wheel Of Family.mkv. Please check the input file and try again.

All MKV files have been processed and saved in D:\Video\MKVConvert.
Press any key to continue . . .

Why is this happening when "!" is present in the filenames and how can I change the script to fix it? Can I remove delayedexpansion alltogether or should I go another route?