跳到主要内容

快速批量重命名脚本

阅读需 6 分钟

在学习时,常常会遇到不会使用收集工具的班委,需要我们自己以特定格式修改文件名称,这种简单重复的工作自然是要交给程序运行的啦~

脚本内容

本脚本可以实现在特定格式文件夹下重命名所有doc文件,可以通过修改变量配置来实现在不同文件夹下重命名不同格式文件

需要注意的是,本脚本只适用于重命名单个文件,重名名多个文件会导致文件覆盖

@echo off
setlocal enabledelayedexpansion ::启用延迟变量扩展
chcp 936 > nul

set num=your_number
set class=your_class
set name=your_name
set month=%date:~5,2%
set day=%date:~8,2%

set searchUrl=where_your_script_exec
set searchFilePattern=*.doc*
set searchFolderPattern=2024-!month!-!day!-*

@REM cd /d %searchUrl% ::默认运行在当前目录下,如果要重命名别的目录下的文件需要切换目录

@REM 列出所有当天的目录
for /f "delims=" %%i in ('dir /b !searchFolderPattern!') do (
set folder=%%i
@REM 进入目录
pushd !folder!
@REM 遍历目录下的文件并重命名
for /r %%j in (%searchFilePattern%) do (
set newName="!num!-!class!!name!-!month!!day!%%~xj"
rename "%%j" "!newName!"
echo "!folder!\%%~nxj" 被重命名为 !newName!
)
@REM 退出目录
popd
)
echo=
echo ---------------------
echo ^|全部重命名完成 :-D ^|
echo ---------------------
echo=
pause

执行结果

"2024-09-12-folderName\新建 Microsoft Word 文档.docx" 被重命名为 "your_number-your_classyourName-0912.docx"

---------------------
|全部重命名完成 :-D |
---------------------

请按任意键继续. . .

知识总结

setlocal enabledelayedexpansion		::启用延迟变量扩展
启用延迟变量扩展可以动态赋值给变量
这意味着你可以在一个代码块内部修改变量的值,并在该代码块的后续部分立即使用这个新值
启用延迟扩展后,需使用 !param! 来引用变量的当前值,而不是使用 % %,后者引用的是变量的原始值
endlocal 命令用于恢复到延迟扩展未启用的状态,并且清除在 setlocal 块中设置的所有变量。这是在批处理脚本中管理变量作用域的好方法

%date:~5,2%
%date% 用于获取当前日期,%date%格式由系统区域设置决定
:~是一个字符串替换操作符,用于从变量值中提取字串
5,2 参数表示子串的起始位置和长度,此处表示%date%(2024/09/12)字符串中第5个,长度为2的子串----09

for /f "delims=" %%i in ('dir /b !searchFolderPattern!') do (...) ::for循环,满足条件则执行do()中的命令
/f 使用文件解析来处理命令输出、字符串及文件内容。下面这是某个高手的解释,更加详细:
[迭代及文件解析--使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。
请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。
文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。
默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。]

-------
格式:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
示例:
本脚本的命令表示:命令行输出的每一行作为一个字段,进行处理
-------
options:
delims=pattern:指定了字段分隔符。在这里,delims= 等号后面为空,表示没有分隔符。这意味着整个命令输出的每一行都将作为一个单独的字段处理
skip=n:指在文件开始时忽略的行数。例如:skip=2 --忽略2行
eol=c:指一个行注释字符的结尾(就一个)。例如:eol=; --忽略以分号打头的那些行
tokens=:太过复杂了。。。看不懂

===============
/d 只显示当前目录下的目录名字,不会递归搜索
-------
格式:
FOR /D %variable IN (set) DO command [command-parameters]
示例:
for /d %%i in (???) do echo %%i --显示当前目录下名字只有1-3个字母的目录

===============
/r 递归搜索路径及子目录中符合的文件
-------
格式:
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
示例:
本脚本中的命令表示遍历目录及其子目录中的所有文件并重命名

===============
/l 该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step
-------
格式:
FOR /L %variable IN (start,step,end) DO command [command-parameters]
示例:
for /l %%i in (1,2,10) do @echo %%i --输出1,3,5,7,9
for /l %%i in (100,-20,1) do @echo %%i --输出100,80,60,40,20
for /l %%i in (1,1,5) do md %%i --建立从1~5共5个文件夹

===============
%%i 这是一个循环变量,相当于java中foreach的变量i/j/k,表示在每次迭代中存储循环处理的当前行的内容
在cmd窗口中使用%i,在批处理文件中使用%%i

===============
in (...) 这部分指定了for循环处理的数据

===============
'dir /b !searchFolderPattern!'
dir /b 表示只列出目录或文件的名称,这句表示列出要搜索的文件夹路径中所有的目录或文件名

至此外层循环结束,外层循环会获取到所有匹配searchFolderPattern设定好的目录或文件的名称,通过调用%%i即可使用目录名

pushd	::切换目录
pushd将当前目录压入目录堆栈,并将当前目录更改为指定的目录。
当你使用 pushd 命令时,它会将当前目录保存在堆栈中,这样你就可以使用 popd 命令恢复到原来的目录
popd 从堆栈中弹出目录,恢复到之前的目录

!!! pushd与cd的区别 !!!
使用 cd 切换目录时,原来的目录路径不会被保存,不能直接回到之前的目录
在临时切换目录时选择pushd无疑是一个明智的选择
!!!

%%~xj ::获取 for 循环中当前迭代的文件的扩展名
%%~n:文件名(不含扩展名)
%%~x:文件扩展名
%%~d:驱动盘符
%%~p:文件路径(不包含盘符和文件名)
%%~z:文件大小(字节数)
%%~j(循环变量):文件绝对路径(包括盘符、路径、文件名、文件拓展名)
!!!循环变量名一定要写在%%~的最后,这样%%~n等别的才会生效!!!

echo= 输出空行

^| 转义|字符