您发布的代码会重命名文件和文件夹。但是,它不会递归重命名文件夹中的文件和文件夹。
鉴于您的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
如果将上述命令放在另一个批处理脚本中,则必须使用。