Parsing exclamation marks in filenames of %%i

Discussion forum for all Windows batch related topics.

Moderator: DosItHelp

Post Reply
Message
Author
RuinedElf
Posts: 1
Joined: 11 Dec 2023 05:15

Parsing exclamation marks in filenames of %%i

#1 Post by RuinedElf » 11 Dec 2023 06:54

Hiya! Got a bit of a question. Been trying to figure out how to parse exclamation marks in filenames when using a variable, as the subject head says.

Currently, I have a batch file that will do what I want it to do (FFMPEG audio extraction as MP3 from MP4 into separate folder). However, I'm stumbling over getting it to recognize exclamation marks in the filename. Please see below:

Code: Select all

@echo off
setlocal EnableDelayedExpansion

set "inputDirectory=X:\Media\YouTube\music_videos\"
set "bitrate=192k"

REM Loop through all MP4 files in the input directory and its subfolders
for /r "%inputDirectory%" %%i in (*.mp4) do (
    set "inputFile=%%i"
    set "outputPath=%%~dpi"
    set "outputFile=!outputPath:_videos=!%%~nxi.mp3"

    REM Ensure the output directory for the current file exists
    if not exist "!outputPath:_videos=!\.." mkdir "!outputPath:_videos=!\.."

    REM Check if the output file already exists
    if not exist "!outputFile!" (
	
    REM Execute FFMPEG command to convert MP4 to MP3 with specified quality
        ffmpeg -i "!inputFile!" -vn -acodec mp3 -ab !bitrate! "!outputFile!"
    ) else (
        echo Output file for "!inputFile!" already exists. Skipping.
	)
)
echo Conversion completed.
pause
As you can see, I have EnableDelayedExpansion since I'm using the !! variables in the loop. My understanding is that this completely locks me out of using exclamation marks in my filenames, but I have to use the !! variables due to the loop. Is this correct? Still very much a newbie! Any help would be much appreciated, thank you!

jeb
Expert
Posts: 1042
Joined: 30 Aug 2007 08:05
Location: Germany, Bochum

Re: Parsing exclamation marks in filenames of %%i

#2 Post by jeb » 12 Dec 2023 07:15

Hi RuinedElf ,

your problem is, that expansion of FOR-variables is only safe when DelayedExpansion is disabled.
But working with variables is only safe when DelayedExpansion is enabled.

You can solve this by toggling delayed expansion.

Code: Select all

REM Loop through all MP4 files in the input directory and its subfolders
SETLOCAL DisabledDelayedExpansion
for /r "%inputDirectory%" %%i in (*.mp4) do (
    set "inputFile=%%i"
    set "outputPath=%%~dpi"
    set "outputFile=!outputPath:_videos=!%%~nxi.mp3"
    SETLOCAL EnabledDelayedExpansion
    ....
    ENDLOCAL
)

Post Reply