Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 跨子文件夹运行批处理脚本(递归)_Windows_Batch File_Recursion_Cmd_Subdirectory - Fatal编程技术网

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