批量更改文件名/文件后缀名(附有代码)

应用情景

2024.12.20 

利用下载软件批量下载文件时,偶尔会出现下载到本地的文件丢失了扩展名,导致无法正常打开下载的文件的情况。若一个一个地给这些文件添加扩展名,不但枯燥无味而且浪费时间,这时可通过批处理程序批量改名。


代码实现

@echo off
echo 开始更改文件名......
set extension=.txt
set /a sum=0
for %%m in (*) do (
if not "%%m"=="batchrename.bat" (
ren "%%m" "%%m%extension%"
set /a sum=sum+1
)
)
echo 文件改名完毕,一共有%sum%个文件被改名!
set sum=
set extension=

运行前

运行后



那么既然这个程序可以批量处理后缀名,那么稍微改进一下便就可以批量修改文件名。

关键点在于我们的第7行“ren”命令

ren 命令是 Windows 操作系统中的一个命令,用于重命名文件或目录。

它的基本语法如下:

ren [旧文件名] [新文件名]

需要注意的是: 在使用 ren 命令时,旧文件名和新文件名必须在同一目录中。

如果文件的扩展名需要更改,新的扩展名应在新文件名中指定。

使用 ren 命令时,请确保你有足够的权限来修改文件或目录的名称。

所以我们只要更改一下变量名以及ren命令的使用即可做到。

但仅仅是修改一下ren命令中变量的顺序只能得到如下结果:

这样的结果显然不能满足工作的需求,那么经过尝试多次后本就乱糟糟的名称变得更加啰嗦。


2024.12.21 

再来明确一下我们想要的更改效果:

最简单的效果就是名称基本一样但是名称后缀有变化,比如:

 此时将用到我们上一篇文章的知识批处理命令的语法与功能中的命令,如下:

setlocal EnableDelayedExpansion

作用:启用延迟变量扩展。这个设置允许在 for 循环中更改变量的值,并在同一循环中使用它们。

必须配合 !variable! 形式来访问变量。



那么在这里避免造成困惑我们来学习一下“%”与“!”在批处理命令中的区别:

1. % 符号

使用场景:% 用于引用变量。在命令的任何地方都可以使用,表示在命令执行时获取该变量的值。

行为:在命令执行时,变量值会立即被解析。这意味着在 for 循环中,如果你在循环内部使用 %来引用变量,变量的值是固定的,不会反映循环内部可能的变化。

2. ! 符号

使用场景:! 用于引用启用了“延迟变量扩展”的变量。通常在 setlocal EnableDelayedExpansion 被

调用后使用。

行为:在启用延迟扩展的情况下,! 允许变量在当前环境中被动态解析。这意味着在 for 循环中,可以引用在循环中被改变的变量值。

总结

使用 % 来引用变量,适用于大多数情况,但是在复杂命令(尤其在循环内部)中可能无法得到最

新的变量值。

使用 ! 来引用变量,在使用延迟扩展时,能够正确获取在当前上下文中最更新的变量值,尤其是在

for 循环和其他需要动态处理的场景中。

在需要动态更新变量值的地方,使用 ! 是更佳的选择。



那么我们便可以去更改我们的基础代码,

效果如下:

 代码如下:

@echo off
setlocal EnableDelayedExpansion

set "basename=新文件"
set /a sum=1

for %%m in (*) do (
    if not "%%m"=="batchrename.bat" (
        set "extension=%%~xm"
        ren "%%m" "!basename!!sum!!extension!"
        set /a sum+=1
    )
)

echo 文件改名完毕,一共有 !sum! 个文件被改名!
endlocal

这时我们的代码已经可以满足基本的批量更改文件名和文件后缀名。



为了有更好的使用体验,决定继续升级程序代码,使其可以批量命名不同的文件名。

2024.12.22

经过不断地尝试,使用C语言地编程知识,终于成功的实现了,如图:

该批处理命令在以往的基础上使用从外部调用文件名称文件,并且通过如下循环函数进行批量命名:

for %%m in (*) do (
    if not "%%m"=="%filename_file%" (
        if not "%%m"=="%~nx0" (
	    for /L %%i in (0,1,%index%) do (
                set "new_name=!newname[%%i]!"
                ren "%%m" "!new_name!" 2>nul
                if errorlevel 1 (
                    echo 无法重命名 "%%m" 为 "!new_name!",可能文件名冲突或无效。
                ) else (
                    set /a sum+=1
                )
            )
        )
    )
)

当然,不仅可以批量命名.txt文件,也可以命名.docx文件,如图:

不过需要提醒的一件事就是,batchrename.bat与filenames.txt的编码都要为ANSI,否则将会出现乱码的情况。