Board logo

标题: [文件操作] [已解决]批处理怎么将图片文件分配到对应的新文件夹去? [打印本页]

作者: linjuming    时间: 2011-3-29 17:57     标题: [已解决]批处理怎么将图片文件分配到对应的新文件夹去?

本帖最后由 linjuming 于 2011-3-31 15:12 编辑





——————————————————————————————————————————————
详细操作要求:

head.png处理:
如果不存在d:\cont\head_cont\文件夹,则创建d:\cont\head_cont\
如果d:\cont\head_cont\下没有子文件夹,则创建d:\cont\head_cont\head_cont_1文件夹
如果d:\cont\head_cont\ 有head_cont_2, head_cont_5这样不连续的文件夹,则创建head_cont_1文件夹
如果d:\cont\head_cont\ 有head_cont_1,head_cont_2, head_cont_5这样不连续的文件夹,则创建head_cont_3文件夹
复制d:\img\head.png 复制到 上一步的文件夹内,并重命名为head_cont_1.png(名字跟文件夹名一样)。
其他图片文件同样处理。
所有图片复制完以后创建d:\img\lock.txt文件,下次如果再运行bat,如果存在d:\img\lock.txt,则直接exit;

________________________________________________________________________

求扩展一下功能:
d:\img 下有如下文件:
head.png
head_1.png
head_2.png
foot.png
line.png
......

head.png 复制到 head_cont_5/head_cont_5.png
head_1.png 复制到 head_cont_6/head_cont_6.png
head_2.png 复制到 head_cont_7/head_cont_7.png
foot.png 复制到 foot_cont_5/foot_cont_5.png
line.png 复制到 line_cont_x/line_cont_x.png
.......

即截取_x前面的英文为文件夹_cont_?的前半部分(因为某些图片我想归类同一cont文件夹下)
作者: namejm    时间: 2011-3-29 18:52

光看图,云里雾里,楼主不妨再配合文字做一些介绍吧。
看你的图,我的理解是仅复制 d:\img\head.png 到 d:\cont\head_cont\head_cont_7 里就完事了
但是你的原意肯定不是这样的
还请楼主用文字描述一下完整意图
“相应”是怎样一种对应法则?
“锁定bat”的含义让人无所适从,推测你的意思是当本次复制到head_cont_7之后,下次再运行bat的时候,不再复制到head_cont_7里去吧?
请楼主多站在看帖人的角度想一下:我这样说别人能理解吗?会产生歧义吗?
作者: linjuming    时间: 2011-3-29 20:52

本帖最后由 linjuming 于 2011-3-29 20:56 编辑

head.png处理:
如果不存在d:\cont\head_cont\文件夹,则创建d:\cont\head_cont\
如果d:\cont\head_cont\下没有子文件夹,则创建d:\cont\head_cont\head_cont_1文件夹
如果d:\cont\head_cont\ 有head_cont_2, head_cont_5这样不连续的文件夹,则创建head_cont_1文件夹
如果d:\cont\head_cont\ 有head_cont_1,head_cont_2, head_cont_5这样不连续的文件夹,则创建head_cont_3文件夹
复制d:\img\head.png 复制到 上一步的文件夹内,并重命名为head_cont_1.png(名字跟文件夹名一样)。
其他图片文件同样处理。
所有图片复制完以后创建d:\img\lock.txt文件,下次如果再运行bat,如果存在d:\img\lock.txt,则直接exit;
作者: Batcher    时间: 2011-3-29 20:56

3# linjuming


请把问题描述全部更新到顶楼,以便他人查看。
作者: namejm    时间: 2011-3-29 21:53

d:\cont\head_cont\下只有形如head_cont_1,head_cont_2,……head_cont_N这样最后一节数字递增的子文件夹么?
假如只存在head_cont_1,head_cont_2, head_cont_5,只需要创建head_cont_3呢,还是需要同时创建head_cont_3和head_cont_4?
如果文件夹都是连续的,还需要接着最后那个编号创建新文件夹吗?如果要创建,要创建到多少号为止?
作者: linjuming    时间: 2011-3-29 22:43

本帖最后由 linjuming 于 2011-3-29 22:46 编辑

如存在1,2,3,则创建4,锁,exit!
如存在1,3,4,则创建2,锁,exit!
如存在1,4,6,则创建2,锁,exit!
如存在2,6,7,则创建1,锁,exit!
每次运行bat,只创建一次文件夹,号码取最小缺少的。
下次如果再运行,手动删除lock.txt,再按上面步骤进行。
作者: tmplinshi    时间: 2011-3-29 22:53

本帖最后由 tmplinshi 于 2011-3-31 13:26 编辑
  1. @echo off
  2. if exist "%~dp0\lock.txt" exit /b
  3. call :o "%~f0" >"%~dp0\lock.txt"
  4. exit /b
  5. :o
  6. pushd "%~dp1"
  7. echo %date%    %time%
  8. echo,
  9. set "DestDir=d:\cont"
  10. set OutDir=
  11. set #dir_num#=1
  12. for %%i in (*.png) do (
  13.     SetLocal EnableDelayedExpansion
  14.     set OutDir_Pre=%DestDir%\%%~ni_cont\%%~ni_cont_
  15.     if not exist "!OutDir_Pre!*" (
  16.         set "OutDir=!OutDir_Pre!1"
  17.     ) else (
  18.         for /d %%D in ("!OutDir_Pre!*") do (
  19.            set /a #dir_num# += 1, _%%~nxD = 0
  20.         )
  21.         for /l %%N in (1 1 !#dir_num#!) do (
  22.             if not defined _%%~ni_cont_%%N (
  23.                  if not defined OutDir set OutDir=!OutDir_Pre!%%N
  24.             )
  25.         )
  26.     )
  27.     md "!OutDir!"
  28.     copy "%%i" "!OutDir!\%%~ni_cont_!#dir_num#!.png" >nul
  29.     echo !OutDir!\%%~ni_cont_!#dir_num#!.png
  30.     EndLocal
  31. )
  32. POPD
  33. goto :eof
复制代码

作者: linjuming    时间: 2011-3-29 23:06

谢谢版主tmplinshi,很完美,不过复制过去的head.png没有重命名为head_cont_1.png,在哪里改一下?
半年没碰批处理,当初的基础基本上忘光了~~,看得一头雾水。
作者: tmplinshi    时间: 2011-3-29 23:29

8# linjuming


已修改
作者: linjuming    时间: 2011-3-29 23:36

太感激了!完美!
作者: haimer    时间: 2011-3-29 23:45

确实很完美
作者: hbwazxf    时间: 2011-3-30 13:23

新手学习一下吧。
作者: linjuming    时间: 2011-3-31 10:34

本帖最后由 linjuming 于 2011-3-31 10:37 编辑

求扩展一下功能:
d:\img 下有如下文件:
head.png
head_1.png
head_2.png

foot.png
line.png
......

head.png 复制到 head_cont_5/head_cont_5.png
head_1.png 复制到 head_cont_6/head_cont_6.png
head_2.png 复制到 head_cont_7/head_cont_7.png
foot.png 复制到 foot_cont_5/foot_cont_5.png
line.png 复制到 line_cont_x/line_cont_x.png
.......

即截取_x前面的英文为文件夹_cont_?的前半部分(因为某些图片我想归类同一cont文件夹下)
作者: tmplinshi    时间: 2011-3-31 11:21

本帖最后由 tmplinshi 于 2011-4-3 23:02 编辑

13# linjuming
  1. @echo off
  2. if exist "%~dp0\lock.txt" exit /b
  3. call :o "%~f0" >"%~dp0\lock.txt"
  4. exit /b
  5. :o
  6. pushd "%~dp1"
  7. echo %date%    %time%
  8. echo,
  9. set "DestDir=d:\cont"
  10. set OutDir=
  11. set #dir_num#=1
  12. for /f "delims=" %%i in (' dir /a:-d /b /o:n *.png ') do (
  13.     SetLocal EnableDelayedExpansion
  14.     set fname_old=%%~ni
  15.     set "fname=!fname_old:.=<d>!"
  16.     for %%i in ("!fname:_=.!") do set fname=%%~ni
  17.     set fname=!fname:.=_!
  18.     set "fname=!fname:<d>=.!"
  19.     set OutDir_Pre=%DestDir%\!fname!_cont\!fname!_cont_
  20.     if not exist "!OutDir_Pre!*" (
  21.         set "OutDir=!OutDir_Pre!1"
  22.     ) else (
  23.         for /d %%D in ("!OutDir_Pre!*") do (
  24.            set /a #dir_num# += 1, _%%~nxD = 0
  25.         )
  26.         for /l %%N in (1 1 !#dir_num#!) do (
  27.             if not defined _!fname!_cont_%%N (
  28.                  if not defined OutDir set OutDir=!OutDir_Pre!%%N
  29.             )
  30.         )
  31.     )
  32.     md "!OutDir!"
  33.     copy "%%i" "!OutDir!\!fname!_cont_!#dir_num#!.png" >nul
  34.     echo !fname_old!.png -^> !OutDir!\!fname!_cont_!#dir_num#!.png
  35.     EndLocal
  36. )
  37. POPD
  38. goto :eof
复制代码

作者: linjuming    时间: 2011-3-31 11:36

就是这样,谢谢版主高手!
作者: Batcher    时间: 2011-3-31 13:33

13# linjuming


请把所有的需求全部更新到顶楼




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