使用批处理脚本递归重命名文件、文件夹和子文件夹

使用批处理脚本递归重命名文件、文件夹和子文件夹
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET old=V1
SET new=newdocV2
for /f "tokens=*" %%f in ('dir /b *.ods') do (
  SET newname=%%f
  SET newname=!newname:%old%=%new%!
  move "%%f" "!newname!"
)

上述编码仅适用于重命名文件或文件夹。

我需要代码来递归重命名文件和文件夹

答案1

您发布的代码确实重命名了文件和文件夹。但是,它没有递归地重命名文件夹内的文件和文件夹。

假设您的 DIR 掩码有扩展名,而文件夹名称通常没有扩展名,我猜您只是想重命名文件,而不是文件夹。如果是这种情况,那么您需要做的就是添加 DIR 选项/S以递归到子文件夹,以及/A-D排除文件夹的选项。您必须通过 将 newname 设置为文件名,而忽略路径%%nxF。而 MOVE 命令需要目标路径%%dpF。这将提供一个通常有效的解决方案,尽管可能会有复杂性(稍后会详细介绍)。

@echo off
setlocal enableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s /a-d *.ods') do (
  set "newname=%%~nxF"
  set "newname=!newname:%old%=%new%!"
  move "%%F" "%%~dpF!newname!"
)

如果您确实想一次性重命名文件和文件夹,那么显然您必须删除该
/A-D选项。但不太明显的是,您必须按降序对 DIR 命令的结果进行排序,以确保先处理子级,然后再处理父级,否则子级重命名将失败,因为列出的路径将不再有效。

@echo off
setlocal enableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s *.ods ^| sort /r') do (
  set "newname=%%~nxF"
  set "newname=!newname:%old%=%new%!"
  move "%%F" "%%~dpF!newname!"
)

现在讨论可能出现的一系列问题以及如何解决这些问题以及其他改进。

1) 文件或文件夹名称可能包含!字符(罕见,但可能)。如果启用了延迟扩展,则扩展 FOR 变量会破坏其值(如果该变量包含)!。解决方案是在循环内打开和关闭延迟扩展。

2) 文件 A 的新名称可能与文件 B 的现有名称匹配,而 MOVE 命令将用 A 覆盖 B。最终结果只有一个文件,而之前有两个。这可能是一件坏事。解决方案是使用 REN 命令而不是 MOVE。在这种情况下,重命名将失败,我认为这是一件好事。REN 命令需要新名称没有目标路径。

3) 您可能需要列出文件/文件夹的重命名方式。如果出现错误,尤其需要列出,以便您可以准确了解哪个重命名失败。简单的解决方案是在执行命令之前 ECHO 一下。

4) 如果新名称与旧名称匹配,则无需进行重命名。这可以通过添加 IF 条件来实现。

@echo off
setlocal disableDelayedExpansion
set "old=V1"
set "new=newdocV2"
for /f "delims=" %%F in ('dir /b /s *.ods ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  )
  endlocal
)

仍然存在一些潜在问题。例如,批处理没有替换=变量值中字符的机制。使用纯批处理很难解决这个问题。

如果你只是使用我的JREN.BAT实用程序- 混合 JScript/批处理脚本,使用正则表达式重命名文件或文件夹。JREN.BAT 是纯脚本,可​​在 XP 及以上版本的任何 Windows 机器上本地运行。完整文档可通过 获得JREN /?。您可能想要使用
JREN /?|MORE,但我的控制台窗口配置了一个大缓冲区,允许我向上滚动查看前几行,所以我不需要 MORE。

您需要了解正则表达式才能使用该工具。在这种情况下这不是问题,但如果您的搜索或替换词包含正则表达式元字符,则需要对其进行转义才能获得正确的文字解释。但正则表达式的威力令人难以置信 - 它可以让您非常具体地了解所做的更改。

我使用该/I选项使搜索不区分大小写。

JREN.BAT 仅重命名文件或者文件,因此需要两个命令来重命名这两个文件。

jren "V1" "newdocV2" /i /s /fm "*.ods"
jren "V1" "newdocV2" /i /s /fm "*.ods" /d

CALL JREN由于 JREN 是一个批处理脚本,因此如果将上述命令放在另一个批处理脚本中,则必须使用。

答案2

这里我的代码成功运行,可以成功重命名文件夹和文件。我想重命名文件内的内容。

这是我用来重命名文件夹和文件的批处理文件脚本,

@echo off
setlocal disableDelayedExpansion
set "old=V21"
set "new=V22"
for /f "delims=" %%F in ('dir /b /s *. *.ods ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  )
  endlocal
)  

答案3

使用以下代码,我能够成功地将文件夹和文件的重命名从 V31 更改为 V32,但无法使用以下代码将 xml 文件内部从 V31 更改为 V32。

@echo off
setlocal disableDelayedExpansion
set "old=V31"
set "new=V32"
for /f "delims=" %%F in ('dir /b /s *. *.xslt ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  ) )

for /f "delims=" %%i in (%xsltfile%) do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%old%=%new%!"
    echo(!line!
    endlocal
))>"%newfile%"
del %textfile%
rename %newfile%  %xsltfile%

  )
)

  endlocal
)  

答案4

使用以下代码,我能够成功地将文件夹和文件的重命名从 V31 更改为 V32,但无法使用以下代码将 xml 文件内部从 V31 更改为 V32。

@echo off
setlocal disableDelayedExpansion
set "old=V31"
set "new=V32"
for /f "delims=" %%F in ('dir /b /s *. *.xslt ^| sort /r') do (
  set "source=%%F"
  set "oldname=%%~nxF"
  setlocal enableDelayedExpansion
  set "newname=!oldname:%old%=%new%!"
  if /i "!newname!" neq "!oldname!" (
    echo ren "!source!" "!newname!"
    ren "!source!" "!newname!"
  ) )

for /f "delims=" %%i in (%xsltfile%) do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%old%=%new%!"
    echo(!line!
    endlocal
))>"%newfile%"
del %textfile%
rename %newfile%  %xsltfile%

  )
)

  endlocal
)  

相关内容