When you perform a rename with wildcards, you get unexpected results, if the length of the specified source and destination are different.

Example: If a folder contains:

abcd1234.xyz
abcd654321.xyz

performing:

cd "<Drive:>\Folder"
rename abcd*.xyz ef*.zyx

results in:

efcd1234.zyx
efcd654321.zyx

and then peforming:

rename ef*.zyx abcd*.xyz

results in:

abcd1234.xyz
abcd654321.xyz

Using WCRename "<Drive:>\Folder\abcd*.xyz" ef*.zyx

results in:

ef1234.zyx
ef654321.zyx

and then running:

WCRename <Drive:>\Folder\ef*.zyx "abcd*.xyz"

results in:

abcd1234.xyz
abcd654321.xyz

The syntax for using WCRename.bat is:

WCRename <Drive:>\Folder\source*.exts destination*.extd \[/s\]

where:

 Source   is the beginning replaceable character string or null. 
 exts   is the source extension or *. 
 destination   is the replacement character string or null. 
 extd   is the destination extension or * 
 /s   is an optional parameter for searching sub-directories. 

WCRename.bat contains:

<b>
@echo off
setlocal
if \{%1\}<h1><a name="_goto_syntax_if_not_exist_1_goto_syntax_if_2_">\{\} goto syntax
if not exist %1 goto syntax
if \{%2\}</a></h1>\{\} goto syntax
set target=%2
set target=%target:\=%
set target=%target::=%
if \{%target%\}<h1><a name="_2_goto_tgt1_syntax_echo_Syntax_WCRENAME_lt_Drive_gt_Folder_Source_exts_Destination_extd_s_endlocal_goto_end_tgt1_pushd_DP1_set_target_2_set_target_target_for_f_Tokens_1_Delims_i_in_echo_2_do_set_target1_i_amp_set_target2_j_set_target1_target1_set_target2_target2_if_target2_">\{%2\} goto tgt1
:syntax
@echo Syntax: WCRENAME "<Drive:>\Folder\Source*.exts" "Destination*.extd" \[/s\]
endlocal
goto end
:tgt1
pushd %~DP1
set target=%2
set target=%target:"=%
for /f "Tokens=1* Delims=*" %%i in ('@echo %2') do set target1="%%i"&set target2="%%j"
set target1=%target1:"=%
set target2=%target2:"=%
if "%target2%"</a></h1>"" set target2=%target1%&set target1=*
set source=%1
set source=%source:"=%
set source2=%source%
:src1
for /f "Tokens=1* Delims=\" %%i in ('@echo %source2%') do set source1="%%i"&set source2="%%j"
set source2=%source2:"=%
if "%source2%"<h1><a name="_set_source2_source_amp_goto_src1_set_work_source2_if_not_work_">"" set source2=??\%source%&goto src1
set work=%source2:\=%
if not \{%work%\}</a></h1>\{%source2%\} goto src1
for /f "Tokens=1* Delims=*" %%i in ('@echo %source2%') do set source1="%%i"&set source2="%%j"
set source1=%source1:"=%
set source2=%source2:"=%
set target1=%target1:"=%
set target2=%target2:"=%
if "%target1%"<h1><a name="_set_target1_if_source2_">"*" set target1=
if "%source2%"</a></h1>"" set source2=%source1%&set source1=*
if "%target2%"=="." set target2=%source2%
set source1=%source1:?=%
for /f "Tokens=*" %%i in ('dir %source% /b /a-d %3') do call :lvl1 "%%i"
popd
endlocal
goto end
:lvl1
pushd %~DP1
set name=%~n1
set ext=%~x1
for /f "Tokens=*" %%i in ('@echo %%name:%source1%^=%target1%%%') do set newname=%%i
rename "%name%%ext%" "%newname%%target2%"
popd
:end</b>