今天在工作时遇到了一个情况,通过高速扫描仪扫描的文件是以图片的形式保存到本地硬盘上的,但是扫描仪给图片命的名就很混乱,并不是我想要的。作为一个强迫症,于是就想到了手动把这些名字改过来。但是这一整个文件夹6、700张图片,一个一个地F2去重命名工作了也是蛮吓人的。。。
思考了一下,Windows自带的CMD不是正好有重命名文件的功能嘛?使用ren命令就行啦。所以说,如果我能在当前存放图片们的文件夹内运行一个循环,让它能够遍历当前文件夹下所有文件,然后做ren操作,理论上来讲就能完成文件的批量重命名了。
说做咱就做!结合以前对CMD命令行的一些了解,加上查询到的相关语法,一个简单的文件批量重命名脚本便写好了。
setlocal ENABLEDELAYEDEXPANSION
for /r %%i in (.) do (
set n=1000
for /f "delims=" %%a in (' dir /b "%%i\*.jpg" 2^>nul ') do (
set /a n+=1
ren "%%i\%%a" "%filename%"!n:~1!%%~xa
)
)
这里解释一下:
setlocal ENABLEDELAYEDEXPANSION
是“开启延迟环境变量扩展”的意思。顾名思义是将当前环境变量的赋值操作做一个延迟。而需要做延迟扩展的变量需要用 “!!”两个英文感叹号包裹起来。(这里做了延迟的变量是上面代码中的 n:~1)。因为批处理中有一个“预处理”的概念,批处理读取命令时是按行读取的,在对指令进行处理之前要完成必要的预处理工作。而这其中就包括对该行命令中的变量赋值。这里如果不使用setlocal ENABLEDELAYEDEXPANSION指令,则n一直到程序执行完,它的值都将会是1000而没有变化。详细解释大家可以参考:setlocal enabledelayedexpansion的作用
然后是for循环,官方给出的解释是:
相应的写法大家可以在cmd里面输入for /?去查看(中间有个空格喔)。
需要说一下的是这里的 2^>nul 其实和一般的 2>nul 没区别。是因为放在了for循环中,所以需要对特殊符号 > 使用 ^ 进行转义。
set /a n+=1
表示给n赋值,每进行一次循环就把n加一。
ren "%%i\%%a" "%filename%"!n:~1!%%~xa
其中
"%filename%"!n:~1!%%~xa
是一个拼接的字符串。!n:~1!是使用了延迟的变量,表示取n向右位移一位的值。例如当 n=1001时,n:~1 的值为 001。
~xa中的a是上面的变量a,即文件的扩展名 .jpg。使用~x参数则表示将变量a的值直接拼接在前字符串的后面。
至此,我们仅用输入文件名前缀,批处理脚本就能帮我们在前缀后面自动编号明明,行程一排整整齐齐的:xx001.jpg 酱婶儿的名字啦~
最后考虑到脚本复用性,我们再对脚本做一丢丢修改,让它不止可以给 jpg 重命名,让他能给任意文件批量重命名。修改后的代码如下:
@echo off
echo *******文件批量重命名*******
echo.
echo.
set /p filename=请输入文件名前缀:
IF "%filename%"=="" set "filename=%%~ni"
set /p suffix=请输入文件类型:
IF "%suffix%"=="" echo.文件类型不能为空 &goto error
IF NOT EXIST *.%suffix% echo.不存在该格式文件 &goto error
setlocal ENABLEDELAYEDEXPANSION
for /r %%i in (.) do (
set n=1000
for /f "delims=" %%a in (' dir /b "%%i\*.%suffix%" 2^>nul ') do (
set /a n+=1
ren "%%i\%%a" "%filename%"!n:~1!%%~xa
)
)
echo. &pause
exit
:error
echo. &pause
毕竟也是花时间查了好久的,随手写篇日志记录一下~
OK,写完收工~