2016-09-22 65 views
2

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

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

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.如何阻止个别命令窗口出现?我将重命名数千一次一个文件,不想看到数千个相应的命令视窗。

谢谢!

+0

你有没有考虑过PowerShell?如果你有系统的重命名方式,那么你可以在PowerShell脚本中编写它,如果你可以提供实际的文件名和它应该重命名为csv文件的名字,那么PowerShell脚本可以实现它。 如果您给我们举例说明如何重命名它,那么可能有人可以给你一些代码。 – Junaid

+0

查看[这个答案](http://stackoverflow.com/questions/8397674/windows-batch-file-looping-through-directories-to-process-files/8398621#8398621)为另一种更简单的方法来做到这一点... – Aacini

回答

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 

在处理上述文件,重命名文件开始(列1的条目),以开始针对

方法(列2的条目。):

运行批处理作为

batchname文件名

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

如何:

具有被设置为从,设置filename1&2到供给的参数的值开始处理的目录名。

如果只有1被提供时,它是文件名,因此处理它线由行和START“在第一组的报价与窗口名称”最小化的新方法/min和与所述数据执行该同批从依次文件的每一行,然后通过转到:eof(结束文件 - 内置到CMD)完成

子过程都具有2个参数(例如BCBSRI-01849357 2011-12-19_BCBSRI-01849357),所以处理前进到:name。这将运行一个for /r循环,从指定的源的目录,与来自第一塔+ *指定的名称,并执行:process传递发现作为参数1

:processchangeme到所讨论的文件名的文件名,通过去除计算endpart字符串filename1changeme这将提供呃,结束部分。

然后只需将提供的文件名重命名为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搜索的目录序列。为了提供路径,谷歌“改变路径窗口” - 有经验的批处理程序在批处理文件的路径上创建一个单独的目录。有时,他们将目录命名为“钟楼”。

+0

非常感谢您的帮助!我在问题中发布了一些其他信息,如果您有任何其他想法,我将不胜感激。 – lneidorf

+0

@Magoo +1,我们需要更多这样的答案 – samdd

相关问题