引言:

已经很多年不写代码了,这两年只是听说AI辅助生成码,但也没实际上手操作过。所以当实际看到AI生成批处理直接可用时,还是感慨了一下:曾经要自己先学习,再写出这样代码,再进行不断调试,弄一个实际能用的东西出来,搞不好要好几天。现在半分钟就出来了,还没有任何Bug,程序员市场需求减量确实是个大趋势。

一、背景

过年期间,整理一台老的笔记本电脑,结果发现有很多曾经备份的手机照片,其中有大量的.hwbk文件,猜是HuaWeiBackup的意思,再看文件名格式一般是“.IMG_日期_序号.jpg”,这肯定是华为手机自己备份的照片了。自己去掉了一个文件的.hwbk后缀,变成jpg文件,打开发现这照片没啥印象。照片即回忆,不可丢弃,所以就想全部恢复一下,再存入一刻相册。

二、过程

实际操作,可以分成两个阶段。

1、批量去掉文件名的.hwbk后缀

这个好办,打开cmd,cd到想批量改名的目录,然后输入:

ren *.hwbk *.jpg

结果发现文件名变成了.XXXX.jpg.jpg。

有重复的后缀?完美症发作,不能忍。第一反应是百度答案,结果就下载了一个工具,安装打开一用,竟然要收费。我自己能搞定的事儿,不接受付费,立即卸载。

替换搜索词,“批量修改文件名中重复的后缀 比如.jpg.jpg”,结果这次百度AI直接提供了批处理代码,写的非常标准:

@echo off

setlocal enabledelayedexpansion

REM 设置目标文件夹路径(请修改为你的实际路径)

set "folder=C:\Your\Target\Folder"

REM 设置要移除的重复后缀(例如 .jpg)

set "suffix=.jpg"

REM 进入目标文件夹

cd /d "%folder%"

REM 遍历所有带有重复后缀的文件

for %%f in (*%suffix%%suffix%) do (

  REM 获取文件名(不含扩展名)

  set "filename=%%~nf"

  REM 去除最后一个后缀,得到新文件名

  set "newname=!filename:%suffix%=!"

  REM 重命名文件

  ren "%%f" "!newname!!suffix!"

)

echo 重命名完成!

pause

直接拷贝进一个空白txt文件,修改set "folder=C:\Your\Target\Folder"中的目录为自己实际的目录,然后保存,修改“.txt”后缀为“.cmd”运行。

嗯,世界清静了。

2、批量去掉文件名中的第一个字符

再往下,导入一刻相册的时候又出问题了,一刻相册竟然没有识别这些.jpg文件,仔细观察,觉得是文件名第一个字符是“.”惹的祸。

继续搜索答案:“批量去掉文件名中开头的.”,结果这次百度AI给三个方案里没有bat方案,其中倒是有个python代码,我这老电脑,也没有pyth环境啊,另外我的python水平,还很一般啊。

然后灵机一动,不就想去掉第一个字符嘛,不用限定是“.”。再来。

搜索条件换成“批量去掉文件名中开头的第一个字符”,这次百度AI终于给出了bat版本的答案:

@echo off

setlocal enabledelayedexpansion

set "folder_path=C:\Your\Target\Folder"

cd /d "%folder_path%"

for %%f in (*) do (

  set "filename=%%~nf"

  set "extension=%%~xf"

  set "new_filename=!filename:~1!!extension!"

  if not "!filename!"=="!new_filename!" ren "%%f" "!new_filename!"

)

echo 文件名修改完成!

pause

还是老样子,做成bat文件执行。

结果是美好,所有调整名称后的jpg文件都成功导入了一刻相册。

就在写这篇帖子的时候,我重新查找了一次“批量去掉文件名中开头的.”,结果百度AI这次又出了bat答案,如下:

@echo off

setlocal enabledelayedexpansion

for %%f in (*) do (

  set "filename=%%~nf"

  set "extension=%%~xf"

  if "!filename:~0,1!"=="." (

    ren "%%f" "!filename:~1!!extension!"

  )

)

echo 批量处理完成!

pause

注意,这次让直接在目标文件夹里执行,缺了自行设置目标目录那几行代码。

三、代码中涉及的有关指令学习

最后,知其然,知其所以然。

我们还是结合这些命令,学习下bat的一些基本命令。

三段代码内容较为类似,合并在一起学习。

@echo off ‌关闭命令回显。

批处理脚本执行时默认显示每一条命令本身的。@echo off之后,就只显示命令的输出结果,从而让界面更简洁。

setlocal enabledelayedexpansion 启用延迟变量扩展

批处理有两种变量,%%圈起来是一般的变量引用方式。

在for循环中,则需要使用!!括起来的的,表示每一次循环都要用最新的赋值。

set "folder_path=C:\Your\Target\Folder"

set "suffix=.jpg" 给变量赋值

如果没有空格等特殊字符,不加引号也可以,一般都应加引号

cd /d "%folder_path%"

进入上面指定的目录内,/d 表示同时切换盘符

for %%f in (*) do (

遍历当前目录内所有文件,并使用%%f变量引用这个文件,如果递归可以使用 /r,比如:

for /r %%f in (*)

for %%f in (*%suffix%%suffix%) do (

遍历符合所有有两个%suffix%后缀的文件

set "filename=%%~nf"

~n,表示获取该文件的文件名

set "extension=%%~xf"

~x,表示获取该文件的后缀(扩展名)

通过以上两行代码,实际运行后filename为“.XXXX.jpg”,extension为“.jpg”

set "new_filename=!filename:~1!!extension!"

:~1表示截取":"前变量字符串第1个字符以后的部分,这行代码就实现了以去掉第一个字符的文件名+后缀为新文件名

set "newname=!filename:%suffix%=!"

:a=b表示将":"前变量字符串中的a替换为b,这行代码实现了去掉文件名中那个多余的后缀名

if "!filename:~0,1!"=="." (

一个只对文件名第一个字符为"."的判断

if not "!filename!"=="!new_filename!" ren "%%f" "!new_filename!"

这个if not判断,避免了新文件名没变化的情况,这样性能会更好吗?

echo 文件名修改完成!

pause

如果是直接运行批处理命令,cmd窗口如果没有这个pause,窗口会直接关闭,不利于查看运行结果是否有异常

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐