Windows 跨子文件夹运行批处理脚本(递归)
我经常不得不在一个子文件夹结构中重命名数百个文件。我一直在创建一个包含所有重命名命令的批处理文件,并手动将其粘贴到每个子文件夹中,以便一次执行一个子文件夹。我想修改批处理脚本,以便它可以一次性对所有子文件夹执行,只从父目录运行一次 我的重命名非常手动,因此我需要为每个文件创建一个离散条目。例如,这里有三行:Windows 跨子文件夹运行批处理脚本(递归),windows,batch-file,recursion,cmd,subdirectory,Windows,Batch File,Recursion,Cmd,Subdirectory,我经常不得不在一个子文件夹结构中重命名数百个文件。我一直在创建一个包含所有重命名命令的批处理文件,并手动将其粘贴到每个子文件夹中,以便一次执行一个子文件夹。我想修改批处理脚本,以便它可以一次性对所有子文件夹执行,只从父目录运行一次 我的重命名非常手动,因此我需要为每个文件创建一个离散条目。例如,这里有三行: REN STWP01_00669087* BCBSRI-01849351* REN BCBSRI-01849357* 2011-12-19_BCBSRI-01849357* REN STWP
REN STWP01_00669087* BCBSRI-01849351*
REN BCBSRI-01849357* 2011-12-19_BCBSRI-01849357*
REN STWP01_00669094* BCBSRI-01849369*
我已经尝试了,包括尝试一个单独的批处理文件来调用我的重命名批处理文件(通过)。不走运
我必须假设这很简单,但我是批处理新手,因此任何帮助都将不胜感激
谢谢
@马古 非常感谢您的回复。到目前为止,你的方法将比我的方法更有效 有几个问题。请容忍我,因为我完全是批处理命令的新手 下面是我所做的:我将您的代码保存到一个.BAT文件(“RRename.BAT”),按照您的说明修改我的文件名,并将它们保存到一个文本文件(“filenames.txt”),然后从命令行运行此命令:{RRename.BAT filenames.txt} 生成的命令窗口确认重命名正确。因此,我删除了ECHO和PAUSE命令并重新运行。不走运。只是一堆确认目录的命令窗口 理想情况下,我希望将其保存为.BAT文件,并将其与包含文件旧名称和新名称的数据文件一起放在顶级目录中。因此,双击“RRename.bat”将解析“Filenames.txt”的内容并遍历所有子文件夹,在遇到匹配项时重命名。轰 为此:
1.如何使{SET“sourcedir=}指示当前目录(即批处理文件所在的目录)?这样我就不需要更改此变量。(我应该注意,我在网络位置上运行此脚本,需要映射驱动器,每次都会产生不同的驱动器号。)
2.如何将数据文件的名称硬编码到脚本本身?我的目标是一个易于复制的过程,最大限度地减少用户输入(保存数据文件的内容)。
3.如何阻止单个命令窗口出现?我将一次重命名数千个文件,不希望看到数千个相应的命令窗口 谢谢!
@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
::读取参数
设置“filename1=%~1”
设置“filename2=%~2”
如果已定义文件名2转到名称
如果未定义文件名1转到:EOF
::1参数-必须是文件名
对于/f“usebackqdelims=““%filename1%”中的%%a”DO START/min“ren%%a”“%~f0”%%a
后藤:eof
::我们有2个参数,因此将模式1重命名为模式2
:姓名
对于(“%filename1%*”)中的/r“%sourcedir%”%%a,请调用:进程“%%a”
暂停
后藤:EOF
::处理文件名并实际执行重命名
:进程
::要更改的文件名-名称和%1的扩展名
设置“changeme=%~nx1”
::用nothing替换多达from模式=名称/扩展名的剩余部分
调用集“endpart=%%changeme:**%filename1%=%%”
::然后重命名。。。
回显(REN“%1”“%filename2%%endpart%”
后藤:eof
您需要更改sourcedir
的设置以适应您的环境
修订数据文件
STWP01_00669087 BCBSRI-01849351
BCBSRI-01849357 2011-12-19_BCBSRI-01849357
STWP01_00669094 BCBSRI-01849369
为了处理上述文件,将文件起始(column1条目)重命名为起始(column2条目)
方法:
按以下方式运行批处理:
批名称文件名
这将执行批处理,处理文件名
如何:
设置开始处理的目录名后,将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 part
然后,只需将提供的文件名重命名为计算出的替换名+endpart
所需的REN命令仅用于测试目的。ECHO
ed。验证命令正确后,将ECHO(REN
更改为REN
以实际重命名文件
暂停只是为了能够看到建议的更改。一旦验证了流程,请将暂停
更改为退出
阿莫伊,跑
*batchname* STWP01_00669094 BCBSRI-01849369
例如,将执行从STWP01_00669094*到BCBSRI-01849369的递归重命名*
可悲的是,“没有运气”毫无意义 我对说明做了一个微小但重要的更改。测试后,
暂停
应更改为退出
测试后,ECHO(…
行应变为
REN "%~1" "%filename2%%endpart%"
它实际上执行重命名。如果您刚刚删除了该行,它将解释没有可见结果的原因
还原原始代码并根据一个小的代表性虚拟子树进行验证后,更改echo(…
行并再次测试。文件名应该更改。如果不更改,则会出现可怕的错误
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=."
path