heyzec
heyzec

Reputation: 61

Batch renaming last few characters of files

I'm trying to create a batch file that would rename a bunch of files in a folder. These files would have a naming of something like: blah(lol).txt. There will always be a four letters, followed by an open bracket, three letters, and finally a close bracket.

I want the batch file to remove the bracketed part of the name of the file, ie. rename the file without the bracketed part.

    for %%i IN (*.txt) DO (set name=%%~ni
    set name2=%name:~1,4%
    ren %%i %name2%)

Why doesn't this work?

Upvotes: 1

Views: 385

Answers (4)

dbenham
dbenham

Reputation: 130819

Magoo provided an explanation as to why your script failed, as well as a working script.

But in your case, there is no need for a script. A simple REN command is all that is needed:

ren "????(???).txt" "????.*"

Upvotes: 2

mordex
mordex

Reputation: 9

a much simpler approach ... try a for loop that cycles through all files in your folder

I'm going to use lol as an example of three letter word inside brackets as stated in your question

@echo off

for %%a in (*) do (

rename "%%a" "%%a(lol).exe"

)

to use this batch file you have to place it in the folder containing the files you wanna rename

Upvotes: -1

Calib
Calib

Reputation: 95

simple but works from the folder with the files to be renamed.

@echo off
title Rename Bat
echo This bat must be in the folder that 
echo contains the files to be renamed.
:begin
echo Enter File Name
set /p old=
echo Enter New Name
set /p new=
ren "%old%" "%new%"
echo File Renamed
ping -n 3 127.0.0.1 >NUL
goto begin

Upvotes: 0

Magoo
Magoo

Reputation: 79982

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
FOR /f "tokens=1,2,3delims=()" %%a IN (
  'dir /b /a-d "%sourcedir%\*(*).*" '
 ) DO ECHO REN "%sourcedir%\%%a(%%b)%%c" %%a%%b%%c

GOTO :EOF

The required REN commands are merely ECHOed for testing purposes. After you've verified that the commands are correct, change ECHO REN to REN to actually rename the files.

Within a block statement (a parenthesised series of statements), the entire block is parsed and then executed. Any %var% within the block will be replaced by that variable's value at the time the block is parsed - before the block is executed - the same thing applies to a FOR ... DO (block).

Hence, IF (something) else (somethingelse) will be executed using the values of %variables% at the time the IF is encountered.

Two common ways to overcome this are 1) to use setlocal enabledelayedexpansion and use !var! in place of %var% to access the changed value of var or 2) to call a subroutine to perform further processing using the changed values.

Upvotes: 1

Related Questions