Board logo

标题: [文件操作] [分享]糟糕的BAT代码风格引发悲剧:文件分类变成了覆盖重命名 [打印本页]

作者: Batcher    时间: 2023-11-14 10:18     标题: [分享]糟糕的BAT代码风格引发悲剧:文件分类变成了覆盖重命名

【问题描述】

闲来无事写个批处理自动整理文件夹,运行逻辑是:检测当前文件夹里是否有各种类型的文件,如果有则对应创建文件夹,如果无则不创建。
把当前路径下各种文件移动到对应名称的文件夹中,并计数,反馈每种类型的文件各自移动了几个、总共移动了几个文件。
然后请AI写了代码,但是最后生成时,别的都能正常生成,反馈也没有报错,但是“图片”项成了一个无类型文件。



导致的悲剧:

图图,俺的图图,呜呜呜
整活时忘备份了,好多张学习资料图都冇了捏
作者: Batcher    时间: 2023-11-14 10:20

【原因分析】

这段脚本里面糟糕的代码风格有多处,我们集中看看导致悲剧的这一行:
  1. if exist *.jpg if exist *.png if exist *.bmp mkdir /p "图片"
复制代码
问题1:

创建文件夹的时候 /p 参数在Linux系统里面某些情况下是有用的。
而Windows系统里面既不支持这个参数,也不需要这个参数。
应该修改为 md "图片"

问题2:

这句代码里面,多个if条件写在一行,是逻辑“且”的意思,而不是逻辑“或”。
也就是说:
  1. if exist *.jpg if exist *.png if exist *.bmp md "图片"
复制代码
相当于:
  1. if exist *.jpg (
  2.     if exist *.png (
  3.         if exist *.bmp (
  4.             md "图片"
  5.         )
  6.     )
  7. )
复制代码
很明显这意味着需要同时存在jpg、png、bmp三种格式,它才会创建“图片”文件夹。
如果一开始就把脚本写成这个格式,也许使用者就不会被迷惑了吧。

运行代码的时候,由于只有一种或两种格式,“图片”文件夹没有被创建,于是:
move "%%i" "图片"
这里本来是想把文件移动到“图片”文件夹,结果实际是把文件重命名为“图片”。

可以修改成这样表示逻辑“或”:
  1. if exist *.jpg (
  2.     md "图片"
  3. )
  4. if exist *.png (
  5.     md "图片"
  6. )
  7. if exist *.bmp (
  8.     md "图片"
  9. )
复制代码
整个原始脚本里面类似的错误还有多处,这里不再赘述。

结论:

踏踏实实按照正确(也许是一种你觉得难看)的格式书写代码。
备份。备份。备份。
作者: Five66    时间: 2023-11-14 10:44

啊这,批处理吧看过的帖子
还有,真有人这样写代码么?
作者: buyiyang    时间: 2023-11-14 17:33

主要是move目标可以是目录也可以是文件,如果是目录的话最好这样写便于识别
  1. move "[srcfile|srcfolder]" "desdir\"
复制代码
copy、xcopy我也会这样处理,防止出错。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2