批处理替换指定目录下所有文件夹名和文件名

  • Post author:
  • Post category:其他


近期遇到个问题,需要将电脑上某个目录下所有的文件夹名和文件名(包含子文件夹下的)的某个字符串统一替换,文件数量很多,有上千个甚至上万个,同样需要处理的电脑还有很多台,一个个改是不可能的,那得改到猴年马月去了,必须得开发个脚本自动处理。但由于电脑上没有任何开发环境,因为特殊原因也不允许安装任何开发软件,只能尝试Windows自带的Dos命令,也就是批处理。

需要自定义的参数有三个,分别是指定目录targetDir,原字符串originText,新字符串newText,按实际情况自行修改即可,例如下面的D:\work、strOld和strNew。

@echo off
setlocal enabledelayedexpansion
set targetDir=D:\work
set originText=strOld
set newText=strNew
D:
cd %targetDir%
for /R %%s in (.,*) do (
echo %%s
set originPath=%%~nxs
set newPath=!!originPath:%originText%=%newText%!
ren "%%s" "!newPath!"
)
pause


脚本使用注意事项:

set语句里的=两边没有空格;

如果字符串里有中文的话,把文件编码改为ANSI格式,否则会有乱码。


脚本开发注意事项:

变量引用有%%和!!两种,按dos的解释,%%是取环境变量,!!是延迟环境变量的扩充,在if、for等嵌套语句里,如果对某一变量重复赋值时,用!!才能实时取到值,用%%取到的永远是最后一次赋值的值,同时在前面需要加个开关声明setlocal enabledelayedexpansion。


可能存在的问题及解决办法

脚本可能存在一个问题:由于系统遍历的顺序是先遍历文件夹,然后再进入文件夹里遍历子文件夹和子文件,所以如果该文件夹名字被替换的话,会跳过子文件夹以及子文件的遍历,响应的替换操作也会跳过。

解决该问题有两种办法:

办法一:多执行几次脚本,最多执行次数是指定目录的文件树的层数,也就是子文件夹最多的层数。

办法二:把重命名的命令输出追加到文件,改为echo ren “%%s” “!newPath!”>>run.bat,这样run.bat会有很多条重命名的语句,一个文件夹或文件对应一个,然后将所有的命令拷贝至Excel,进行倒序处理,第一条的放最后,最后一条的放前面等等,然后再将倒序后的所有命令拷贝回run.bat,最后双击运行即可。原理是手动让程序先遍历子文件夹和子文件,最后再遍历父文件夹。

总结

Windows自带的批处理命令,能快速处理文件相关的操作,新建、删除、查询、重命名等。优点在于不依赖三方库,即写即运行,效率也还可以;缺点在于语法相对生硬,不易理解,书写困难,开放的接口有限,自由度不大。如果条件允许,建议使用Python等其他高级语言处理,开发效率更高。效果更好。



版权声明:本文为fudqson原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。