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

问题描述

在此代码中我必须更改什么,以便它也可以执行子文件夹? 还是仅通过子文件夹运行会更容易?

@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)不匹配,因此,如果这在目标环境中可能是个问题,则应包括修改或添加内容以解决此问题。