本文章在:2018年06月26日 15:35:50 发表于:CSDN
2018年11月17日 迁移至新博客服务器。?

????????今天在工作时遇到了一个情况,通过高速扫描仪扫描的文件是以图片的形式保存到本地硬盘上的,但是扫描仪给图片命的名就很混乱,并不是我想要的。作为一个强迫症,于是就想到了手动把这些名字改过来。但是这一整个文件夹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循环,官方给出的解释是:

20180626151843724.png2018062615194329.png

相应的写法大家可以在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,写完手工~

TIM????‰?20180727173654.jpg


摸鱼癌晚期患者