欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Windows下的通过命令行批量重命名文件

程序员文章站 2024-03-18 17:10:28
...

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

Windows下的通过命令行批量重命名文件

Windows下的通过命令行批量重命名文件

相应的写法大家可以在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

        毕竟也是花时间查了好久的,随手写篇日志记录一下~Windows下的通过命令行批量重命名文件

        OK,写完手工~

【 个人博文链接:http://wishes-blog.cn/detail/15/firstPage