跨子文件夹运行批处理脚本(递归)

时间:2016-09-22 04:01:42

标签: windows batch-file recursion cmd subdirectory

我经常需要在子文件夹结构中重命名数百个文件。我一直在创建一个包含所有重命名命令的批处理文件,并手动将其粘贴到每个子文件夹中以一次执行一个子文件夹。我想修改批处理脚本,使其一举对所有子文件夹执行,从父目录运行一次。

我的重命名非常手动,因此我需要为每个文件创建一个离散条目。例如,这里有三行:

REN STWP01_00669087* BCBSRI-01849351*
REN BCBSRI-01849357* 2011-12-19_BCBSRI-01849357*
REN STWP01_00669094* BCBSRI-01849369*

我已尝试使用FOR /R command,包括尝试调用我的重命名批处理文件的单独批处理文件(通过CALL command)。没运气。

我必须假设这很简单,但我是批处理新手,所以任何帮助都会受到赞赏。

谢谢!

@Magoo,

非常感谢您的回复。到目前为止,您的方法将远远超过我自己的方法。

几个问题。请耐心等待我,因为我是批处理命令的新手。

这就是我所做的:我将您的代码保存到.BAT文件(“RRename.bat”),根据您的说明修改我的文件名并将其保存到文本文件(“Filenames.txt”),然后运行来自命令行的此命令:{RRename.bat Filenames.txt}。

生成的命令窗口确认正确重命名。所以我删除了ECHO和PAUSE命令并重新运行。没运气。只是一堆命令窗口确认目录。

理想情况下,我希望将其保存为.BAT文件,只需将其与包含旧名称和文件新名称的数据文件一起放在顶级目录中即可。因此,双击“RRename.bat”将解析“Filenames.txt”的内容并在所有子文件夹中工作,在遇到匹配的地方重命名。繁荣。

为此目的:
1.如何使它{SET“sourcedir =}表示当前目录(即批处理文件所在的目录)?这样我就不需要改变这个变量。(我应该注意到我我在网络位置运行此脚本,这需要我映射驱动器,每次都会产生不同的驱动器号。)
2.如何将数据文件的名称硬编码到脚本本身?我的目标是一个易于复制的过程,最大限度地减少用户输入(除了数据文件的内容) 3.如何停止显示各个命令窗口?我将一次重命名数千个文件,并且不希望看到数千个相应的命令窗口。

谢谢!

1 个答案:

答案 0 :(得分:2)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
:: read parameters
SET "filename1=%~1"
SET "filename2=%~2"
IF DEFINED filename2 GOTO name
IF NOT DEFINED filename1 GOTO :EOF
:: 1 parameter - must be filename
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO START /min "ren %%a" "%~f0" %%a
GOTO :eof

:: we have 2 parameters so rename pattern 1 to pattern 2

:name
FOR /r "%sourcedir%" %%a IN ("%filename1%*") DO CALL :process "%%a"
PAUSE

GOTO :EOF

:: Process the filenames and actually do the rename
:process
:: Name of file to be changed - name and extension of %1
SET "changeme=%~nx1"
:: REPLACE up-to-from-pattern with nothing = remainder of name/extension
CALL SET "endpart=%%changeme:*%filename1%=%%"
:: and RENAME...
ECHO(REN "%~1" "%filename2%%endpart%"
GOTO :eof

您需要更改sourcedir的设置以适合您的具体情况。

修订数据文件

STWP01_00669087 BCBSRI-01849351
BCBSRI-01849357 2011-12-19_BCBSRI-01849357
STWP01_00669094 BCBSRI-01849369

旨在处理上述文件,将文件重命名(column1条目)重命名为开始(column2条目。)

方法:

将批处理作为

运行

batchname filename

这将执行批处理,处理文件名

如何:

设置目录名称以开始处理,将filename1&2设置为所提供参数的值。

如果仅提供1,则为文件名,因此逐行处理并使用第一组引号中的窗口名称将新进程/min最小化“并执行同一批次依次使用文件每一行的数据,然后转到:eof(文件结束 - 内置到CMD)

子流程都有2个参数(例如BCBSRI-01849357 2011-12-19_BCBSRI-01849357),因此处理传递给:name。这将从指定的源目录运行for /r循环,其名称从第一列+ *指定,并执行:process传递作为参数1找到的文件名。

:processchangeme设置为相关文件名,通过从endpart删除字符filename1来计算changeme,这将传递er,end部分。

然后只需将提供的文件名重命名为endpart计算的替换名称。

为了测试目的,所需的REN命令仅为ECHO在您确认命令正确后,将ECHO(REN更改为REN以实际重命名文件。

暂停只是为了允许看到建议的更改。验证流程后,将PAUSE更改为EXIT

AAMOI,正在运行

*batchname* STWP01_00669094 BCBSRI-01849369
例如,

将从STWP01_00669094 *执行递归重命名到BCBSRI-01849369 *

可悲的是,“没有运气”毫无意义。

我对指示做了一个小的但重大的改变。测试后PAUSE应更改为EXIT

经过测试,ECHO(...行应该变为

REN "%~1" "%filename2%%endpart%"

实际执行重命名。如果您刚删除了该行,则会解释不可见结果。

恢复原始代码并针对小型代表性虚拟子树进行验证后,更改echo(...行并再次测试。文件名更改。如果没有,有些事情是错误的。毋庸置疑,这对我来说非常愉快......

然后再次尝试将PAUSE更改为EXIT。这次,生成的窗口将出现在任务栏上,然后在输入文件的该行的重命名完成后消失。例如,BCBSRI-01849357 rentwo会发生一次 - 对于每个单独的文件rename而言不会发生一次。

要对文件名进行硬编码,请删除

IF NOT DEFINED filename1 GOTO :EOF

并替换

FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO START /min "ren %%a" "%~f0" %%a

FOR /f "usebackqdelims=" %%a IN ("YOURFILENAMEHERE") DO START /min "ren %%a" "%~f0" %%a

对于“从此处运行”命令,请更改

SET "sourcedir=U:\sourcedir"

SET "sourcedir=."

.表示“当前目录”

如果将 thisbatchfilename.bat 放入 PATH 的任何目录中,则只需执行 thisbatchfilename 即可运行例程。

您可以输入

来显示路径
path

在提示符下。 PATH 是Windows搜索的目录序列,用于查找当前目录中找不到的可执行文件。对于chane path,谷歌“更改路径窗口” - 有经验的游戏者在批处理文件的路径上创建一个单独的目录。有时,他们将目录命名为“Belfry”。