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


1
@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!"
)

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

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


欢迎来到超级用户!你能否编辑你的问题,告诉我们你自己尝试过什么来解决这个问题?
Twisty Impersonator


@JosefZ - 进行递归重命名并不那么简单。请参阅我的回答
dbenham 2015年

find . -iname "*.ods" -print0 | xargs -0 rename "s/V1/newdocV2/g"- 这将适用于Gnu / Linux,或者可能是微软的Powershell(我被告知它符合Posix标准,但没有看到它。
ctrl-alt-

Answers:


1

您发布的代码会重命名文件和文件夹。但是,它不会递归重命名文件夹中的文件和文件夹。

鉴于您的DIR掩码有扩展名,并且由于文件夹名称通常没有扩展名,我猜你只想重命名文件,而不是文件夹。如果是这种情况,那么您需要做的就是添加DIR /S选项以递归到子文件夹,以及/A-D排除文件夹的选项。您必须将newname设置为仅文件名,忽略路径via %%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,但我的控制台窗口配置了一个大缓冲区,允许我向上滚动以查看以前的行,所以我不需要更多。

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

我使用该/I选项使搜索对大写/小写不敏感。

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

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

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


0

这里我的代码成功地成功地重命名了文件夹和文件。我想在文件内部重命名内容。

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

@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
)  

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

0

使用下面的代码,我能够成功地将文件夹和文件的重命名从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
)  

嗨user420936,这是你在这个问题上的第三个答案,不清楚它在多大程度上回答了这个问题,哪个部分应该是你的新问题。请使用一个答案来回答这个问题(如果您愿意),删除其他问题并为您的XML部分创建一个自己的问题。
bummi 2015年

您可能错过了帖子下的编辑链接。请参观游览并访问帮助中心,了解我们与普通论坛不同。
rene 2015年

0

使用下面的代码,我能够成功地将文件夹和文件的重命名从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
)  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.