Esse arquivo em lote deve fazer isso por você.
Copie o arquivo de lote abaixo em um arquivo de texto e salve-o como xrename.cmd (ou "whatever you want.cmd").
Se você acabou de executar o arquivo assim:
xrename.cmd
Ele irá procurar na pasta atual e em todas as subpastas e renomear todos os arquivos como: ABC12345_DEF para ABC12345.DEF (qualquer coisa como "text_moretext" para "text.moretext").
Você também pode fornecer valores para "string de pesquisa", "string de substituição" e "padrão de pesquisa" na linha de comando.
Para mostrar instruções, execute-as assim:
xrename.cmd / help
Observação: fiz o arquivo em lote para exibir apenas os arquivos que serão renomeados, sem renomear . Você pode executar o arquivo em lote e ver o que acontecerá sem renomear nada. Depois de executá-lo e ter certeza de que os arquivos corretos serão renomeados corretamente, você poderá excluir a linha conforme descrito abaixo para tornar a renomeação ativa e, em seguida, executar o arquivo em lotes novamente.
Você pode ter que modificar o valor de "padrão de pesquisa" para exibir os arquivos desejados.
Nos rótulos ": default1" e ": default2", você pode editar os valores de "string de correspondência" "padrão de pesquisa" e "string de substituição" para atender às suas necessidades.
Esse arquivo em lote tem alguma verificação de erros e não falhará se a "string de correspondência" for encontrada nos nomes de qualquer uma das pastas ou subpastas.
@echo off
if "%~1%~2%~3."=="." goto :default1
if /i "%~1."=="/help." goto :syntax
if "%~1."=="." goto :syntax
rem %2 can be empty to use "*matchstring*" as the "search-pattern"
rem %3 can be empty to make replacement with empty string (delete matchstring).
set "matchstring=%~1"
set "replacestring=%~3"
if "%~2."=="." goto :default2
set "searchpattern=%~2"
goto :start
:default1
set "matchstring=_"
set "replacestring=."
:default2
set "searchpattern=*%matchstring%*"
:start
set "renamecount=0"
set "errorcount=0"
echo.
for /r %%f in ("%searchpattern%") do call :work "%%~dpf" "%%~nxf"
echo.
if %renamecount% EQU 0 echo No files renamed.
if %renamecount% EQU 1 echo Renamed %renamecount% file.
if %renamecount% GEQ 2 echo Renamed %renamecount% files.
if %errorcount% EQU 1 echo %errorcount% error renaming files.
if %errorcount% GEQ 2 echo %errorcount% errors renaming files.
echo.
goto :cleanexit
:work
set matchedfilepath=%~1
set matchedfilename=%~2
rem You can't do it directly like this:
rem set "newfilename=%matchedfilename:%matchstring%=%replacestring%%"
for /F "usebackq delims=" %%g in ('echo set "newfilename=%%matchedfilename:%matchstring%=%replacestring%%%"') do %%g
echo In path "%matchedfilepath%": Renaming "%matchedfilename%" to "%newfilename%"
rem delete the next line (goto :EOF) to make renaming active
goto :EOF
ren "%matchedfilepath%%matchedfilename%" "%newfilename%"
if %errorlevel% NEQ 0 goto :workerror
if not exist "%matchedfilepath%%newfilename%" goto :workerror
goto :workok
:workerror
echo Rename "%matchedfilepath%%matchedfilename%" failed.
set /A errorcount=errorcount+1
echo.
goto :EOF
:workok
set /A renamecount=renamecount+1
goto :EOF
:syntax
rem:syntax
echo.
echo Syntax:
echo %~nx0 ["match-string" ["search-pattern"] ["replace-string"]]
echo.
echo Search for files matching "search-pattern" in current folder and through all
echo subfolders. For each matched file, rename file by replacing "match-string"
echo with "replace-string".
echo.
echo If "replace-string" is empty or not specified, rename file by deleting
echo "match-string".
echo.
echo If "search-pattern" is empty, use "*matchstring*" as the "search-pattern".
echo.
echo If "match-string" "search-pattern" and "replace-string" are all empty or not
echo specified, then defined defaults will be used.
echo.
echo If "search-pattern" and/or "replace-string" are NOT empty then "match-string"
echo cannot be empty,
echo.
goto :EOF
:cleanexit
set "matchstring="
set "replacestring="
set "searchpattern="
set "renamecount="
set "errorcount="
set "matchedfilepath="
set "matchedfilename="
set "newfilename="
goto :EOF
Depois de executar o arquivo em lotes e ter certeza de que os arquivos corretos serão renomeados corretamente, edite o arquivo para remover a (s) linha (s) descrita (s) para tornar a renomeação ativa e execute o arquivo em lotes novamente.
Para fazer isso, encontre as duas linhas que são assim:
rem delete the next line (goto :EOF) to make renaming active
goto :EOF
Em seguida, remova a linha que diz "goto: EOF" (ou remova as duas linhas).
Não remova "goto: EOF" de qualquer outro lugar no arquivo de lote (ele pode ser encontrado em alguns lugares, portanto, certifique-se de remover o correto).
Se isso não estiver funcionando para você, ou se você quiser que eu explique tudo no arquivo de lote, apenas me avise.