Board logo

标题: [文件操作] 【已解决】能否批处理将指定图片复制到多个目录中,并自动按规率改名? [打印本页]

作者: 228630386    时间: 2025-1-23 23:00     标题: 【已解决】能否批处理将指定图片复制到多个目录中,并自动按规率改名?

本帖最后由 228630386 于 2025-1-26 00:14 编辑

将指定的图片如A.jpg复制到当前目录下的文件夹中,放在尺寸为1200x1200尺寸的最后,命名规率是1,2,3,4,15,16,17,18,19,20,21,22,最多是23,其它尺寸图片保留不变。

假设1113235656文件夹中尺寸为1200x1200像素有1,2,3,4,15,16,17,然后复制文件A进去改为18
假设1656596556文件夹中尺寸为1200x1200像素有1,2,3,4,15,16,17,18,19,然后复制文件A进去改为20
如果类推,如果文件夹中有其它尺寸图片,命名不变。

因为上传不了附件,不知道大神们能不能理解。
作者: jiavip    时间: 2025-1-24 07:30

本帖最后由 jiavip 于 2025-1-24 07:38 编辑

楼主表达不是很清楚想要的准确效果,但是这些理论上来说都可以实现的,
一般想到的是借助第三方工具,但是VBS有个函数就可以判断!
  1. Set Img = CreateObject("WIA.ImageFile")
  2. Img.LoadFile WScript.Arguments(0)
  3. Wscript.Echo  "宽"&Img.Width&"高"& Img.Height&"像素"&Img.HorizontalResolution
复制代码
脚本可以分这几个思路去写,
1,先获取图片基本参数,宽、高、像素!
2,再获取 1113235656 & 1656596556 文件夹下有现多少个文件,
3, 写好&判断 文件递进命名规则,
4,IF 文件,,操作,,,,脚本完成!
作者: aloha20200628    时间: 2025-1-24 11:11

本帖最后由 aloha20200628 于 2025-1-24 19:00 编辑

回复 1# 228630386

以下代码存为 test.bat 运行,与 *.jpg 图片文件同目录
代码中假设 1200x1200 尺寸的图片文件名命名规则均为 n.jpg 其中 n=整数
  1. 2>1/* ::
  2. @echo off &setlocal &set/p "pF=拖入要复制的图片文件:"
  3. if not defined pF exit/b
  4. set "pF=%pF:"=%"
  5. for /f %%n in (
  6.   'dir /b/a-d *.jpg^|findstr /ib "[0-9][0-9]*\.jpg"^|cscript /nologo /e:jscript "%~f0" '
  7. ) do if %%n gtr 0 copy /y "%pF%" "%%n.jpg"
  8. pause&exit/b */
  9. ws=WSH.stdin, wi=WSH.createobject("wia.imagefile"), maxF=-1;
  10. while (!ws.atendofstream) {
  11. pF=ws.readline(), wi.loadfile(pF);
  12. if (wi.width != 1200 || wi.height != 1200) continue;
  13. n=~~pF.split('.')[0];
  14. if (n>maxF) maxF=n;
  15. }
  16. WSH.echo(++maxF), WSH.quit();
复制代码

作者: jiavip    时间: 2025-1-24 14:19

回复 3# aloha20200628


    哇,BAT & JS 混编的狠人啊,!膜拜一下!
作者: 228630386    时间: 2025-1-24 18:11

本帖最后由 228630386 于 2025-1-24 18:12 编辑

回复 3# aloha20200628


    你好,是需要将拷贝到文件夹哪一张图片改为n.jpg吗?不是很理解怎么操作。拖入一个图片文件,我试了把拷图的图拖进去,但是不行。
作者: aloha20200628    时间: 2025-1-24 18:46

本帖最后由 aloha20200628 于 2025-1-24 19:02 编辑

回复 5# 228630386

订正了3楼代码...
代码运行开始会等候输入或拖入要复制的图片文件全路径名(例如 d:\jpg\abc.jpg)
然后遍历当前目录中全部1200x1200尺寸的 n.jpg 文件,获取其中 n 的最大值+1(例如19+1),作为 d:\jpg\abc.jpg 文件复制到当前目录后的新名 20.jpg

作者: 228630386    时间: 2025-1-24 19:51

本帖最后由 228630386 于 2025-1-24 19:57 编辑

回复 6# aloha20200628


在单个目录下可以实现n+1改名了,但通常一个文件夹中有多个子文件夹,如:
d:\111\abc.jpg
d:\222\abc.jpg
d:\333\abc.jpg
d:\444\abc.jpg
能否改成当前目录下的所有文件夹的目录中全部1200x1200尺寸的abc.jpg,都改在n+1呢?


@echo off
for /d %%a in (*) do copy "abc.jpg" "%%~a\"
pause
这是我目前在用的,但不能自动n+1改名,要手动操作。
作者: aloha20200628    时间: 2025-1-24 21:12

本帖最后由 aloha20200628 于 2025-1-24 21:13 编辑

回复 7# 228630386

以下代码会递归处理当前目录下的每一个子目录》将要复制的图片文件复制到每一个子目录中,并更名为与其对应的 n+1.jpg
  1. 2>1/* ::
  2. @echo off &setlocal &set/p "pF=拖入要复制的图片文件:"
  3. if not defined pF exit/b
  4. set "pF=%pF:"=%"
  5. for /r /d %%d in (*) do (
  6.   pushd "%%d" & for /f %%n in (
  7.   'dir /b/a-d *.jpg^|findstr /ib "[0-9][0-9]*\.jpg"^|cscript /nologo /e:jscript "%~f0" "%%d" '
  8.   ) do if %%n gtr 0 copy /y "%pF%" "%%n.jpg"
  9.   popd)
  10. pause&exit/b */
  11. v=WSH.arguments, ws=WSH.stdin, wi=WSH.createobject("wia.imagefile"), maxF=-1;
  12. while (!ws.atendofstream) {
  13.     pF=ws.readline(), wi.loadfile(v(0)+'\\'+pF);
  14.     if (wi.width != 1200 || wi.height != 1200) continue;
  15.     n=~~pF.split('.')[0];
  16.     if (n>maxF) maxF=n;
  17. }
  18. WSH.echo(++maxF), WSH.quit();
复制代码

作者: 228630386    时间: 2025-1-26 00:14

回复 8# aloha20200628


    太感谢了,完美解决了问题,不用手动操作,节省太多时间了。




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