如何将文件名中嵌入的字符更改为另一个字符?

如何将文件名中嵌入的字符更改为另一个字符?

在具有多个子目录的目录中,我需要将包含字符的文件名更改_为另一个字符:.,例如:

ABC12345_DEF --> ABC12345.DEF

我需要通过目录树递归执行此操作。
文件名的最后三个字符并不总是相同的。

_在或的两侧使用重命名通配符.不起作用(而且我需要通过几个目录来执行此操作)。

答案1

以下应该有效。由于在处理引号中的文件名时的特殊性,我使用了move而不是。renren

for /f "tokens=1,2 delims=_" %i in ( 'dir /s/b *_*.' ) do @( move "%i_%j" "%i.%j" )

@如果您想直观地跟踪命令的进度,可以删除。

答案2

这个批处理文件应该可以帮你完成这个任务。

将下面的批处理文件复制到文本文件中,并将其保存为 xrename.cmd(或“whatever you want.cmd”)。

如果您只是像这样运行文件:
xrename.cmd

它将查找当前文件夹和所有子文件夹,并重命名所有文件,如:将 ABC12345_DEF 重命名为 ABC12345.DEF(将“text_moretext”重命名为“text.moretext”)。

您还可以在命令行上为“search-string”、“replace-string”和“search-pattern”提供值。

要显示说明,请按如下方式运行:
xrename.cmd /help

笔记:我制作了批处理文件仅显示将被重命名的文件,无需重命名确实会发生。您可以运行批处理文件并查看会发生什么,而无需实际重命名任何内容。一旦您运行它并确信正确的文件将被正确重命名,您可以删除下面描述的行以激活重命名,然后再次运行批处理文件。

您可能需要修改“search-pattern”的值来显示您想要的文件。

在标签“:default1”和“:default2”处,您可以编辑“match-string”,“search-pattern”和“replace-string”的值以满足您的需要。

该批处理文件有一些错误检查,如果在任何文件夹或子文件夹的名称中发现“匹配字符串”,它就不会失败。

@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

运行批处理文件并确信正确的文件将被正确重命名后,您可以编辑该文件以删除所描述的行以使重命名处于活动状态,然后再次运行批处理文件。

为此,找到如下两行:

rem delete the next line (goto :EOF) to make renaming active
goto :EOF

然后,删除“goto :EOF”这一行(或者删除两行)。

不要从批处理文件的任何其他位置删除“goto:EOF”(它可以在几个地方找到,因此请确保删除正确的)。

如果这对您不起作用,或者您希望我解释批处理文件中的任何内容,请告诉我。

答案3

修改我在此批量重命名/移动脚本这应该有效:

for /r %x in (*_*) do ren "%x" *.*

相关内容