[英]Run Batch Script Across Subfolders (Recursively)
我经常不得不在一个子文件夹结构中重命名数百个文件。 我一直在创建一个包含所有重命名命令的批处理文件,并手动将其粘贴到每个子文件夹中以一次执行一个子文件夹。 我想修改批处理脚本,使其一举对所有子文件夹执行,只从父目录运行一次。
我的重命名非常手动,因此我需要为每个文件创建一个离散条目。 例如,这里有三行:
REN STWP01_00669087* BCBSRI-01849351*
REN BCBSRI-01849357* 2011-12-19_BCBSRI-01849357*
REN STWP01_00669094* BCBSRI-01849369*
我已经尝试过FOR /R 命令,包括尝试调用我的重命名批处理文件的单独批处理文件(通过CALL 命令)。 没运气。
我必须假设这很简单,但我是批处理新手,因此将不胜感激。
谢谢!
@Magoo,
非常感谢您的回复。 到目前为止,您的方法将比我的方法有效得多。
几个问题。 请耐心等待,因为我是批处理命令的新手。
这就是我所做的:我将您的代码保存到 .BAT 文件(“RRename.bat”),按照您的说明修改我的文件名并将它们保存到文本文件(“Filenames.txt”),然后从命令行:{RRename.bat Filenames.txt}。
生成的命令窗口确认正确的重命名。 所以我删除了 ECHO 和 PAUSE 命令并重新运行。 没运气。 只是一堆确认目录的命令窗口。
理想情况下,我希望将其保存为 .BAT 文件,然后将其与包含文件旧名称和新名称的数据文件一起放在顶级目录中。 因此,双击“RRename.bat”将解析“Filenames.txt”的内容并遍历所有子文件夹,在遇到匹配项的地方重命名。 繁荣。
为此:
1. 我如何使它{SET "sourcedir=} 指示当前目录(即批处理文件所在的目录)?这样我就不需要更改这个变量。(我应该注意我我在网络位置运行这个脚本,这需要我映射驱动器,导致每次都有不同的驱动器号。)
2. 如何将数据文件的名称硬编码到脚本本身中? 我的目标是一个易于复制的过程,最大限度地减少用户输入(保存数据文件的内容)。
3. 如何阻止单个命令窗口出现? 我将一次重命名数千个文件,并且不想看到相应命令窗口的数千个文件。
谢谢!
@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
旨在处理上述文件,重命名文件开始(列1条目)开始(列2条目。)
方法:
运行批处理
批处理名文件名
这将执行批处理,处理文件名
如何:
设置开始处理的目录名称后,将filename1&2
设置为提供的参数值。
如果仅提供 1,则它是文件名,因此逐行处理它并开始一个新进程/min
最小化“使用第一组引号中的窗口名称”,并使用每一行的数据执行相同的批处理依次访问文件,然后转到:eof
(文件结尾 - CMD 内置)
子流程都有 2 个参数(例如BCBSRI-01849357 2011-12-19_BCBSRI-01849357
)所以处理传递给:name
。 这会从指定的源目录运行for /r
循环,名称从第一列 + *
指定,并执行:process
传递作为参数 1 找到的文件名。
:process
将changeme
设置为有问题的文件名,通过从changeme
删除字符串filename1
来计算endpart
,这将提供er, end 部分。
然后只需将提供的文件名重命名为替换名称+计算出的endpart
。
所需的 REN 命令只是ECHO
ed 用于测试目的。 在验证命令正确后,将ECHO(REN
更改为REN
以实际重命名文件。
PAUSE 只是为了让建议的更改可见。 验证过程后,将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 搜索的目录序列,以查找可执行文件。 要更改路径,请使用谷歌“更改路径窗口”- 经验丰富的批处理人员在批处理文件的路径上创建一个单独的目录。 有时,他们将目录命名为“Belfry”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.