批量重命名文件夹及其所有子文件夹中的文件

批量重命名文件夹及其所有子文件夹中的文件

我尝试在 win7 下借助批处理脚本从每个文件名中删除“-min”部分来重命名文件夹和子文件夹中的所有文件

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
FOR /R %%A in (.*)-min.png DO REN "%%A-min.png" "%%A.png"

我猜这里的 SET 参数好像有问题,因此我尝试这样做:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
For /R %%G in (*-min.png) DO (
    SET "oldname=%%G"
    SET "newname=!oldname:~0,-8!.png"
    REN "!oldname!" "!newname!"
)

但我得到的都是错误。当我回显循环中的最后一条指令时,它会给出正确的路径。我遗漏了什么?

答案1

重命名文件时,目标名称中不能包含文件夹路径。您可以使用%%~nxG来获取不带路径的文件名和扩展名。您不需要 oldname 变量 - 只需使用 即可%%G。您可以删除一行并直接在 REN 语句中执行字符串操作。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
CD F:\Mega.Pack-128x128\textures\
For /R %%G in (*-min.png) DO (
    SET "newname=%%~nxG"
    REN "%%G" "!newname:~0,-8!.png"
)

请注意,如果文件路径的任何部分包含该!字符,上述操作将失败,因为 FOR 变量扩展发生在延迟扩展之前,因此它会破坏值。!通过确保在扩展 FOR 变量时禁用延迟扩展,可以保留任何内容。这需要在循环内打开和关闭延迟扩展。

@echo off
setlocal disableDelayedExpansion
cd F:\Mega.Pack-128x128\textures\
for /r %%G in (*-min.png) do (
  set "oldpath=%%G"
  set "newname=%%~nxG"
  setlocal enableDelayedExpansion
  ren "!oldpath!" "!newname:~0,-8!.png"
  endlocal
)

相关内容