批量重命名子文件夹中的文件名

Batch rename filename in subfolder

我必须在此代码中更改什么才能使其也可以处理子文件夹? 或者如果仅通过子文件夹 运行 更容易?

@echo off
setlocal enableDelayedExpansion
for %%F in (*.jpg) do (
  set "name=%%F"
  ren "!name!" "!name:_=!"
)

这 运行 在当前文件夹中没问题,它在 jpg 文件名字符“_”中删除,但我不知道如何在子文件夹中执行此操作,这是我的主要目标。

可以使用 For /R 循环:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
For /R . %%G In ("*_*.jpg") Do (
    Set "name=%%~nxG"
    SetLocal EnableDelayedExpansion
    If Not Exist "%%~dpG!name:_=!" Ren "%%G" "!name:_=!"
    EndLocal
)

我在 /R 之后使用了一个 . 字符来表示当前目录作为递归基础,虽然这不是必需的,因为如果没有提供路径则假定当前目录,它作为提醒,如果需要,您可以在其中包含另一条路径。


尽管您也可以使用 For /F 循环,但使用 Dir 命令:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
For /F "EOL=? Delims=" %%G In ('Dir /B/S/A:-D "*_*.jpg"') Do (
    Set "name=%%~nxG"
    SetLocal EnableDelayedExpansion
    If Not Exist "%%~dpG!name:_=!" Ren "%%G" "!name:_=!"
    EndLocal
)

在这种情况下,如果您想使用当前目录以外的目录,可以直接将其插入 Dir glob 中,例如"C:\SomePath\*_*.jpg"


但是请注意,在这两种情况下,都没有尝试确保删除下划线后的剩余字符串是有效的文件名。如果您希望在您的环境中拥有健壮的代码,那么您有责任加入这样的检查。此外,不包括检查以确保短文件名 (8.3) 不匹配,因此如果这在您的目标环境中可能是一个问题,那么您应该包括修改或添加以满足为此。