在Windows中批量重命名子目录

3
我有一个包含成千上万个子目录的文件夹,它们包含自己的子目录需要重命名。我使用的是Windows 7机器,但我没有管理员权限,因此无法下载简单的程序来代替我完成这项工作。
现在,我有一个测试目录 C:\test,其中有一些子目录名为old,我正在尝试使用批处理文件将它们更改为new
请注意,我想要以下内容:
C:\test\1\old
C:\test\2\old
C:\test\3\old
变成
C:\test\1\new
C:\test\2\new
C:\test\3\new
非常感谢您提供的任何帮助。

看看 robocopy 和 for 命令(在提示符下键入 help for 将让您开始)。 - rene
2个回答

1

我很快想到了以下解决方案。我在本地进行了快速测试,并且似乎实现了您的要求:

@echo off

FOR /D %%D IN ("C:\test\*") DO CALL :RENAME %%D

:RENAME
SET CRITERIA=\old
FOR /D %%R IN (%1%CRITERIA%) DO RENAME %%R "new"

将其保存为批处理文件并尝试运行。希望能有所帮助。

它对我提供的测试场景起作用,但对于我想重命名的真实文件夹却不起作用。我不确定是因为存在多个子目录还是子目录名称中的特殊字符影响了它。 - innate
所以我已经缩小了范围,发现子目录中有括号。有什么解决办法吗? - innate
有趣的是,重命名命令应该适用于任何有效的目录名称。子目录只有两层深吗?这意味着它只能深入到C:\test\1\old吗? - Justin Chmura
实际目录格式为:C:\test test\1111 (AAAA)\old - innate
2
@innate: 你可能需要在 :RENAME 后面的 %%D%1%CRITERIA%RENAME 后面的 %%R 周围添加引号。在第一个循环后添加 GOTO :EOF 可以跳过子程序。然而,我认为你不需要第二个循环或子程序。只需将 ... DO CALL:RENAME %%D 替换为 ... DO RENAME "%% D \ old" new 即可完成。 - Andriy M
感谢 Andriy 整理了这个。我只是根据我能记得的东西随便拼凑了一下。 :) - Justin Chmura

1

Justin的回答对于我的类似问题非常有帮助,虽然默认情况下它只处理了一个更简单的模式\A\B\C,其中A是基本目录,B是一些未确定的目录,C是你要查找的目录。

我修改了他的脚本,使其递归基本目录A直到找到C。

这是脚本,编写以期望命令行参数:

@echo off

set BASEDIR=%1
SET CRITERIA=\%2
SET REPLACENAME=%3

call :FindDirs %BASEDIR%

GOTO END

:FindDirs
FOR /D %%F IN ("%1\*") DO CALL :RENAME %%F
GOTO:EOF

:RENAME
REM echo DIR=%1
FOR /D %%R IN ("%1%CRITERIA%") DO (
    if EXIST %%R RENAME %%R "%REPLACENAME%"
)
call :FindDirs %1
GOTO:EOF

能否举个例子说明一下这是如何工作的?我尝试了以下代码:subfrn "_Release" "48x48" "40x40" ...其中subfrn是批处理文件。我在与bat文件相同的目录下有一个名为_Release的文件夹。我正在尝试将_Release的所有子文件夹从文件夹名称48x48重命名为40x40。 - KingOfHypocrites
实际上这个是可以工作的,尽管它在完成时会返回一个错误。"系统找不到指定的批处理标签" - KingOfHypocrites

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接