[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 914
  • Last Modified:

command prompt rename files in sequential serie

Hello I want to order a serie of files I have  in c:\data


   and so on any number of files.
   This files could be hundred and there are names that doesn't exist in sequence like file003.pdf, file005.pdf, etc. Now in command prompt what script could be to order in sequence all that files and the numbers of the fies doesn't exist will be taken for next files in sequence for example file003.pdf doesn't exist then file004.pdf will take the name of file003.pdf in our example file007.pdf will take the name of file004.pdf, file009.pdf will take the name of file005.pdf and so on until the end of files .pdf only. The final result pf all process will be in other words:

file001.pdf - not touched because is ok in order
file002.pdf - not touched because is ok in order
file004.pdf - renamed to file003.pdf
file007.pdf - renamed to file004.pdf
file009.pdf - renamed to file005.pdf
file010.pdf - renamed to file006.pdf

 The final files ordered in resume:


   If anyone could help with a command .bat script.
Thank you
  • 2
1 Solution
Try it with this; it's in test mode and will only display the "ren" commands it would normally run, so that you can test it. Remove the uppercase ECHO in line 24 to run it for real.
@echo off
setlocal enabledelayedexpansion
REM *** Folder in which the files are:
set SourceFolder=D:\Temp\FileRename
REM *** File prefix until the numeric index:
set FilePrefix=file
REM *** File extension to search:
set Extension=pdf
REM *** Length of the numeric index:
set IndexLength=3

set ZeroString=0000000000
call :GetStringLength PrefixLength "%FilePrefix%"
set /a CurrentIndex = 1
for /f "delims=" %%a in ('dir /b /a:-d /o:n "%SourceFolder%\%FilePrefix%*.%Extension%"') do (
	set FileName=%%~na
	set FileIndex=!FileName:~%PrefixLength%,%IndexLength%!
	call :GetFormattedIndex FormattedIndex !CurrentIndex! %IndexLength%
	echo Processing %%a; file index is '!FileIndex!', sequential index is '!FormattedIndex!' ...
	if "!FileIndex!"=="!FormattedIndex!" (
		echo ... indices match, no change.
	) else (
		echo ... file index not in sequential order, will rename.
		ECHO ren "%SourceFolder%\%%a" "%FilePrefix%!FormattedIndex!.%Extension%"
	set /a CurrentIndex += 1
goto :eof

:GetFormattedIndex <ReturnVariable> <Index> <Length>
set __string=%ZeroString%%~2
set %1=!__string:~-%3!
goto :eof

:GetStringLength <ReturnVariable> <String>
set /a i = 0
set __string=%~2
if "!__string:~%i%,1!"=="" (
	set %1=%i%
	goto :eof
) else (
	set /a i += 1
	goto :StringLengthLoop
goto :eof

Open in new window

coerraceAuthor Commented:
Works perfect including if you put  IndexLength longer than 3
Amazing code!!!
Hi coerrace

You may have been left wondering why you received an email notification of a comment submitted before the one by oBdA.  I started writing a batch file yesterday and had posted a "working on this" comment, but something came up and I had to leave what I was doing, so I deleted the comment and wasn't able to finish what I had started.  oBdA's batch file is along the same lines as I was heading, but is much better.

coerraceAuthor Commented:
Oh I see honestly the first thing at the morning was see the oBdA I tested but never saw a working on this, but is ok.
Thank you for all

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now