Was hoping to get some help here. I have a bunch of files that are monitored and the ending facility removed, files look as follows:
LastName, FirstName_DOS-Facility.pdf
I currently run the below:
@echo off
for /F "tokens=1,* delims=-" %%a in ('dir /A-D /B "*.pdf"') do (
ECHO move "%%a-%%b" "%%a%%~xb"
)
And it creates LastName, FirstName_DOS.pdf
The issue I'm running into is multiple files with the same name, my batch file just replaces the older file with the newer. Is there a way to append a _1.pdf _2.pdf _3.pdf , etc if needed? Thank you for the help!
Here is a commented batch code suitable for your task requirements.
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "tokens=1* delims=-" %%a in ('dir "*-*.pdf" /A-D /B 2^>nul') do (
if not exist "%%a%%~xb" (
ren "%%a-%%b" "%%a%%~xb"
) else (
call :GetNextAppendix "%%a" "%%~xb"
ren "%%a-%%b" "%%a!NextAppendix!%%~xb"
)
)
endlocal
goto :EOF
rem This subroutine inserts between file name passed as first argument
rem and file extension passed as second argument an underscore and an
rem incrementing number in range 1 to 50000 and checks if a file with
rem this name already exists. If there is no file with current number
rem in file name, this number with the preceding underscore is assigned
rem to an environment variable used in parent process routine to rename
rem the file.
:GetNextAppendix
for /L %%I in (1,1,50000) do (
if not exist "%~1_%%I%~2" (
set "NextAppendix=_%%I"
goto :EOF
)
)
rem Windows command interpreter should never reach this part of the code.
rem But in case of this really happens, simply clear the appendix variable
rem which results in a failed renaming of file in parent process loop
rem above with output of an error message because of file already existing.
set "NextAppendix="
goto :EOF
For understanding the used commands and how they work, open a command prompt window, execute there the following commands, and read entirely all help pages displayed for each command very carefully.
call /?
echo /?
endlocal /?
for /?
goto /?
if /?
ren /?
set /?
setlocal /?
And see also the Microsoft article about Using command redirection operators for an explanation of 2^>nul
which is 2>nul
with redirection operator >
escaped with ^
to be applied on execution of command DIR and not being interpreted as redirection operation for command FOR at an invalid position within the command line.
This redirects the error message output by DIR on no file matching the wildcard pattern *-*.pdf
from STDERR to device NUL to suppress it.