Connor Tshudy
Connor Tshudy

Reputation: 13

Batch script to remove parentheses and spaces from all file names

I have to manipulate dozens if not hundreds of images fairly often. When I get the images, it's often 1018u182012480d1j80.jpg type filenames, so I can select all of the images, and then hit 'F2' to rename them all to image (1).jpg | image (2).jpg | ... etc. Can someone write me a batch script to remove the parentheses and the spaces in the file names?

If possible, it'd be great if I didn't even have to open it up and edit the batch file to update the current dir, I.E, if it can just use %CD% or something to get the current folder, that would be awesome.

I don't understand batch files at all but here's one I found that will remove the parentheses, but I have to add the sourcedir.

@ECHO OFF
SETLOCAL
SET "sourcedir=C:\.." #Can we make this just find the location?
FOR /f "delims=" %%a IN (
  'dir /b /s /a-d "%sourcedir%\*" '
 ) DO (
 SET "name=%%~na" 
 SETLOCAL ENABLEDELAYEDEXPANSION
 SET "newname=!name:)=!"
 SET "newname=!newname:(=!"
 IF "!name!" neq "!newname!" (
  IF EXIST "%%~dpa!newname!%%~xa" (ECHO cannot RENAME %%a
   ) ELSE (REN "%%a" "!newname!%%~xa")

 )
 endlocal
)

Upvotes: 0

Views: 4217

Answers (1)

JosefZ
JosefZ

Reputation: 30238

The script should work if file names/paths does not contain any ! exclamation mark.

Supply a folder path as an argument (see sample calls below). This can be done even by file explorer's drag&drop feature (drag a folder, drop on batch). Read call /? or Command Line arguments (Parameters) for %~1 explanation.

Narrow to only .jpg files using "%sourcedir%\*.jpg" in FOR /f line.

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion

SET "sourcedir=%~1"                               supplied string
if NOT defined sourcedir SET "sourcedir=%CD%"     current directory if nothing supplied

rem basic validity check
if NOT exist "%sourcedir%\*" (
  echo wrong directory "%sourcedir%"
  goto :next 
)
FOR /f "delims=" %%a IN ('dir /b /s /a-d "%sourcedir%\*" ') DO (
  SET "name=%%~na" 
  SETLOCAL ENABLEDELAYEDEXPANSION
      rem     remove ) right parenthesis
  SET "newname=!name:)=!"
      rem        remove ( left parenthesis
  SET "newname=!newname:(=!"
      rem        remove ↓ space(s)
  SET "newname=!newname: =!"
  IF "!name!" neq "!newname!" (
      IF EXIST "%%~dpa!newname!%%~xa" (
        ECHO cannot RENAME %%a
      ) ELSE (
        rem operational RENAME command is merely ECHO-ed for debugging purposes 
        ECHO RENAME "%%a" "!newname!%%~xa"
      )
  )
  ENDLOCAL
)
:next
rem pause to see output 
pause

Sample call without argument - applies to the current directory:

d:\bat\SU> D:\bat\SO\43097467.bat
RENAME "d:\bat\SU\New Text Document.txt" "NewTextDocument.txt"
RENAME "d:\bat\SU\Files\ruzna pisma.png" "ruznapisma.png"
RENAME "d:\bat\SU\Files\volume control options.png" "volumecontroloptions.png"
RENAME "d:\bat\SU\Files\volume mixer.png" "volumemixer.png"
RENAME "d:\bat\SU\Files\1126981\ERKS 100004_thumb.jpg" "ERKS100004_thumb.jpg"
Press any key to continue . . .

Sample call with argument - applies to the supplied directory:

d:\bat\SU> D:\bat\SO\43097467.bat D:\test\43097467
RENAME "D:\test\43097467\image do - Copy (2).bmp" "imagedo-Copy2.bmp"
cannot RENAME D:\test\43097467\image do - Copy (3).bmp
RENAME "D:\test\43097467\image do - Copy (4).bmp" "imagedo-Copy4.bmp"
Press any key to continue . . .

Sample call, argument with spaces must be enclosed in a pair of double quotes:

d:\bat\SU> D:\bat\SO\43097467.bat "D:\bat\odds and ends\a b"
RENAME "D:\bat\odds and ends\a b\c d\my list_Utf8.txt" "mylist_Utf8.txt"
RENAME "D:\bat\odds and ends\a b\c d\e f\h i batch.bat" "hibatch.bat"
RENAME "D:\bat\odds and ends\a b\c d\e f\System locale.png" "Systemlocale.png"
Press any key to continue . . .

d:\bat\SU>

Upvotes: 2

Related Questions