目录
背景
早就听说AI可以写代码,一直不以为然。前阵用豆包生成一些简单代码段,可以参考,但是直接执行还是有各种问题。这次又遇到一个小问题,想再次试试AI写代码,并且调试代码的能力。
先上结论: AI很牛,已经具备一些让人不感相信的逻辑分析能力。
需求
需求来源于折腾,没有需求就瞎折腾。帮妈妈下载了一些广场舞的视频,拷进SD卡插入Mp4视频播放器就能自动播放。但是文件顺序是乱的,不方便查找,二是某些视频需要放在前面。因此,需要给视频文件名前一个序号,这样也方便记住一些常用视频的编号,使用播放器的按键可以直接定位视频。
AI编程及debug
准备一些文件
python 代码有问题
还是使用豆包。因为以前用过一个批量改名的windows小工具,但是忘记名字,本想问问豆包是否知道这事,结果 。。。
首先向豆包提出需求: 文件 名批量改名 小工具。
豆包,直接给出源码方案,一个python版本,一个bat版本。恰好机器上也有python环境,运行了下没有任何输出,也没有改变文件名。使用python ide检查了一下源码,发现有语法错误,也可能是文件格式问题,就没有再深究,转向bat源码方案。
bat版本一(file_1, file2, …)
提问词: windows 文件名 批量加上顺序编号 小工具
豆包给出BAT源码如下:
@echo off
setlocal enabledelayedexpansion
set "directory=C:/Users/YourUsername/YourDirectory"
set "prefix=file_"
set "index=1"
for /f "delims=" %%F in ('dir /b /a-d /o:n "%directory%\*.*"') do (
set "file=%%F"
ren "%directory%\!file!" "%prefix%!index!%%~xF"
set /a index+=1
)
放到待改名文件夹内,直接运行,结果正确: 文件被改为file_1, file2, …, 没有保留原始名字。继续改进
bat版本二(1.jpg, 2.jpg)
提问词: windows, 给当前目录 下 文件, 批量改名, 增加顺序编号 bat
没有前缀,只保留了文件扩展名
@echo off
setlocal enabledelayedexpansion
set "counter=1"
for %%F in (*) do (
if not "%%F"=="%~nx0" (
ren "%%F" "!counter!_%%F"
set /a counter+=1
)
)
bat版本三(将编号 改为位数字)
基于上一个版本: 将编号 改为位数字
豆包回复如下, 本来是想说 将编号 改2位数字, 少了2这个题词,但是豆包默认改为了3位数字。
@echo off
setlocal enabledelayedexpansion
set "counter=001"
for %%F in (*) do (
if not "%%F"=="%~nx0" (
ren "%%F" "!counter!_%%F"
set /a counter+=1
if!counter! LSS 10 set "counter=00!counter!"
if!counter! GEQ 10 if!counter! LSS 100 set "counter=0!counter!"
)
)
但是这个代码执行有问题, 只能成功修改一个文件。
请豆包调试: 以上代码 只能修改第一个文件 , 解释 debug一下
豆包回复如下, 似乎是判断到if条件出了问题,豆包还引入了一个new_counter的变量,但是不得要领,还是只能修改一个文件 ,程序就退出了。
人工debug后,发现是豆包给的代码if!new_counter!
, if 后面少了空格,导致程序逻辑判断错误,而且有的序号用了2次。但是不告诉豆包,让他继续定位问题。
@echo off
setlocal enabledelayedexpansion
set "counter=001"
for %%F in (*) do (
if not "%%F"=="%~nx0" (
ren "%%F" "!counter!_%%F"
set /a new_counter=counter+1
if!new_counter! LSS 10 set "counter=00!new_counter!"
if!new_counter! GEQ 10 if!new_counter! LSS 100 set "counter=0!new_counter!"
set "counter=!new_counter!"
)
)
请豆包调试: 这段代码 ,替换文件名时, 前缀有连续的情况,请debug一下
这次豆包给了另外一种方案
@echo off
setlocal enabledelayedexpansion
set "counter=001"
set "index=0"
set "filelist="
for %%F in (*) do (
if not "%%F"=="%~nx0" (
set "filelist=!filelist! "%%F""
)
)
for %%A in (%filelist%) do (
set /a index+=1
ren "%%~A" "!counter!_%%~A"
set /a counter+=1
set "counter=1000!counter!"
set "counter=!counter:~-3!"
)
依然 没有解决问题,仍有文件被多次重命名或跳过
继续请豆包调试: 当前文件夹下有多种不同类型的文件, 编写处理脚本 ,为其加上2位数字的前缀,按顺序添加。
进一步明确需求,回复如下:
@echo off
setlocal enabledelayedexpansion
set "counter=01"
for /f "delims=" %%F in ('dir /b /a-d') do (
if not "%%F"=="%~nx0" (
set "filename=%%~nF"
set "extension=%%~xF"
ren "%%F" "!counter!_!filename!!extension!"
set /a counter+=1
if!counter! LSS 10 (
set "counter=0!counter!"
)
)
)
这里应该还是 if!counter!, if后面没有空格导致出错, 但是即使手工修改这个bug, 代码还是会对不同后缀的文件分别编号。这不符号本文需求。
继续: 以上代码,有bug, 有两个文件序号前缀重复了,请修订
@echo off
setlocal enabledelayedexpansion
set "counter=01"
for /f "delims=" %%F in ('dir /b /a-d') do (
if not "%%F"=="%~nx0" (
set "filename=%%~nF"
set "extension=%%~xF"
ren "%%F" "!counter!_!filename!!extension!"
set /a counter+=1
if !counter! LSS 10 (
set "counter=0!counter!"
)
)
)
以上代码,专门考虑了扩展名, 再加上人工加上if后面的空格 后,代码执行正常,即使有多种扩展名的文件,也能统一编号 排序 。测试效果如下:
最终应用:
其他豆包给出的方案
%
避免文件列表混乱的方法是将文件移动到一个临时目录中,重命名后再移回原目录。
REM 仍然存在问题,因为当前文件 中有多种扩展名的文件存在
REM : 将文件名和扩展名分开处理,重命名时将新的编号添加到文件名部分,保持扩展名不变
%
@echo off
setlocal enabledelayedexpansion
set "counter=001"
mkdir temp 2>nul
for %%F in (*) do (
if not "%%F"=="%~nx0" (
move "%%F" temp
)
)
for /F "delims=" %%F in ('dir /b /a-d temp') do (
set "filename=%%~nF"
set "extension=%%~xF"
ren "temp\%%F" "!counter!_!filename!!extension!"
set /a counter+=1
set "counter=1000!counter!"
set "counter=!counter:~-3!"
move "temp\!counter!_!filename!!extension!".
)
rmdir temp