Search code examples
datebatch-filerename

batch add a character(s) in the middle of a filename using cmd


So I have files (mostly documents) with a file name beginning with "YYYYMMDD - Title of file.etc" I'm wanting to change the date format to YYYY-MM-DD I'm wanting to do a script to batch rename since I'll be doing this every now and then.

My bat code so far after a 2 days of research to no avail:

for %%a in ("*.*") do ren *.* ????-??-??*.*
pause

Any help or point to the right direction for me to look at would be really helpful. Thanks

final

rem // Loop through all matching files:
for /F "eol=| delims=" %%F in ('
    dir /B /A:-D-H-S "*.*"
') do (
    rem // Store the current file name and extension to variables:
    set "NAME=%%~F"
    rem // Enable delayed expansion to avoid trouble with `!`:
    setlocal EnableDelayedExpansion
    rem // Rename file by applying sub-string expansion:
    ren "!NAME!" "!NAME:~,4!-!NAME:~4,2!-!NAME:~6!!EXT!"
    endlocal
)
pause

Solution

  • You are utilising a for loop but not using its meta-variable %%a in the body then, which makes no sense.

    Unfortunately, you cannot just use ren for that, because every ? in the new name represents the character of the old name at that position.

    I would do it the following way:

    rem // First change to the target directory:
    cd /D "D:\Target\Dir"
    rem // Loop through all matching files:
    for /F "eol=| delims=" %%F in ('
        dir /B /A:-D-H-S "*.*" ^| findstr /I "^[1-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9]"
    ') do (
        rem // Store the current file name and extension to variables:
        set "NAME=%%~nF" & set "EXT=%%~xF"
        rem // Enable delayed expansion to avoid trouble with `!`:
        setlocal EnableDelayedExpansion
        rem // Rename file by applying sub-string expansion:
        ren "!NAME!!EXT!" "!NAME:~,4!-!NAME:~4,2!-!NAME:~6!!EXT!"
        endlocal
    )
    

    The [findstr][cmdfnd] is used here to filter for file names that begin with eight decimal digits that could represent a date. If you do not want that simply remove everything from ^| findstr up to the end of that line.

    Delayed variable expansion is needed here, because you are writing and reading variables within the same block of code. Splitting the original name at fixed character positions is done by sub-string expansion.

    (How-To: Extract part of a variable (substring)) [cmdfnd]: https://ss64.com/nt/findstr.html (FINDSTR)