Board logo

标题: [文件操作] 求助先判断后循环:将文件名以指定格式写入指定文件 [打印本页]

作者: ganjie    时间: 2008-12-30 13:43     标题: 求助先判断后循环:将文件名以指定格式写入指定文件

已知某文件夹内有若干文件,文件名为X1、X2、X3、…………,如果文件数小于等于3,那么输出
<tr>
<td>X1</td>
<td>X2</td>
<td>X3</td>
</tr>
若文件数大于3时,输出
<tr>
<td>X1</td>
<td>X2</td>
<td>X3</td>
</tr>
<tr>
<td>X4</td>
<td>X5</td>
<td>X6</td>
</tr>
………………

保存到文本中,文件名为文件夹名,每读取三个文件名后就需要一对<tr> </tr>,如果文件个数超过30个,则输出到另一个文本中,如
<tr>
<td>X31</td>
<td>X32</td>
<td>X33</td>
</tr>
<tr>
<td>X34</td>
<td>X35</td>
<td>X36</td>
</tr>
………………



文件名则为文件夹名加02,每个文件里只能保存30个文件名,如果超过就另存为一个文本,文件名顺序加1就行了,如何才能实现这个判断循环语句呀,求大侠们教一下小弟,谢谢!

[ 本帖最后由 ganjie 于 2008-12-30 14:20 编辑 ]
作者: lhjoanna    时间: 2008-12-30 15:55

看看这个行不?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "cd_=%cd%"
  4. :loop
  5. set "cd_=%cd_:*\=%"
  6. set "cd_tmp=%cd_:\=%"
  7. if not "%cd_tmp%"=="%cd_%" goto loop
  8. set "folder_name=%cd_%"
  9. set n=0
  10. set sign1=1
  11. for /r "%cd%\" %%i in (*.*) do (
  12.   if not "%%~nxi" equ "%~nx0" (
  13.     set /a n+=1
  14.     set /a sign2=n%%30
  15.     if !sign2! equ 1 (
  16.        cd.>"!folder_name!_!sign1!.txt"
  17.        echo ^<tr^>>>"!folder_name!_!sign1!.txt"
  18.     )
  19.     echo ^<td^>%%~ni^</td^>>>"!folder_name!_!sign1!.txt"
  20.     set /a sign3=n%%3
  21.     if !sign3! equ 0 (
  22.        echo ^</tr^>>>"!folder_name!_!sign1!.txt"
  23.        if not !sign2! equ 0 echo ^<tr^>>>"!folder_name!_!sign1!.txt"
  24.     )
  25.     set /a sign1=n/30+1
  26. )
  27. )
  28. if not !sign3! equ 0 echo ^</tr^>>>"!folder_name!_!sign1!.txt"
  29. echo 执行完毕!&pause>nul
复制代码

[ 本帖最后由 lhjoanna 于 2008-12-30 18:14 编辑 ]
作者: ganjie    时间: 2008-12-30 16:32

测试了一下,总体是可以了,但有几个小问题,比如有60个文件,他应生成2个文本,但却生成了3个文本,因为它把生成的文本文件名都加进去了,还有生成的文本里,在结尾里总是多出一个<tr>

[ 本帖最后由 ganjie 于 2008-12-30 16:43 编辑 ]
作者: lhjoanna    时间: 2008-12-30 18:15

哦?刚开始是还没生成文本文件啊,楼主是要反复使用吗?如果是可以修改为建立文本文件到一个其他地址。第二个问题一开始没注意到,已经修改,在楼上更新。
作者: ganjie    时间: 2008-12-31 08:10

测试成功了,生成的文本里,再没有多出一个<tr>,很完美了,我把存放的文本路径改了,它就不需要读取生成的文本文件名了,谢谢了!
作者: ganjie    时间: 2008-12-31 19:17

set /a n+=1  set /a sign2=n%%30  在程序中起什么作用呀,不明白,还有 set /a sign3=n%%3    set /a sign1=n/30+1  编程的思路是什么我还是看不太明白。
作者: lhjoanna    时间: 2008-12-31 20:29

n是用来计数的啊,每处理一个文件就加一个。
         set /a sign1=n/30+1是标记文件名,文件名为 !folder_name!_!sign1!.txt,每达到30个新创建一个文本,那么文本名顺序加一,这就是此句的作用。
         sign2是用来标记当前文件是否满了30,下面一句 if  !sign2! equ 1......就是当文件数达到1、31、61、91等等时,就新建一个文本文件,往新的文本文件里写入内容。   
         set /a sign3=n%%3和此句 if !sign3! equ 0 (...)一起理解。是每三个就加一对<tr></tr>。

[ 本帖最后由 lhjoanna 于 2008-12-31 20:37 编辑 ]
作者: ganjie    时间: 2008-12-31 21:57

%%~nxi这是指读取的文件名了,那%~nx0 这是什么意思?
作者: lhjoanna    时间: 2008-12-31 22:41

if not "%%~nxi" equ "%~nx0" (...)
此句是忽略批处理文件自身,防止自己也被写入到文本文件中,楼主可推测一下 %0 是什么意思。多实践下看。
作者: ganjie    时间: 2009-1-3 09:01

大大,您上面的代码是读取当前文件夹下的文件名,今小弟想求%cd% 下所有目录里的thumb这个文件夹下的所有文件名,以下是的我代码,可老是测试不成功,请大大帮检查一下,谢谢!
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "route=%cd%"
  4. set n=0
  5. set sign1=1
  6. for /f "delims=" %%k in ('dir /ad /b "%route%"') do (
  7. set "as=%%k"
  8. for /r "!as!\thumb\" %%i in (*.*) do (
  9.   if not "%%~nxi" equ "%~nx0" (
  10.     set /a n+=1
  11.     set /a sign2=n%%30
  12.     if !sign2! equ 1 (
  13.        cd.>"%%k_!sign1!.txt"
  14.        echo ^<tr^>>>"!as!_!sign1!.txt"
  15.     )
  16.     echo ^<td^>%%~nxi^</td^>>>"!as!_!sign1!.txt"
  17.     set /a sign3=n%%3
  18.     if !sign3! equ 0 (
  19.        echo ^</tr^>>>"!as!_!sign1!.txt"
  20.        if not !sign2! equ 0 echo ^<tr^>>>"!as!_!sign1!.txt"
  21.     )
  22.     set /a sign1=n/30+1
  23. )
  24. )
  25. )
  26. if not !sign3! equ 0 echo ^</tr^>>>"%%k_!sign1!.txt"
  27. echo 执行完毕!&pause>nul
复制代码

作者: lhjoanna    时间: 2009-1-3 22:35     标题: 回复 10楼 的帖子

把此句for /f "delims=" %%k in ('dir /ad /b "%route%"') do (...)改为for /f "delims=" %%k in ('dir /ad /b') do (...)看看。
作者: ganjie    时间: 2009-1-3 22:57

测试了,连个文本也看不见,没有什么输出的。
作者: lhjoanna    时间: 2009-1-3 23:40

改动了几个地方,上面题的句子改成了for /f,for /r原因我还在测试中。还有其他几个地方,你对比下即可。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "route=%cd%"
  4. set n=0
  5. set sign1=1
  6. for /f "delims=" %%k in ('dir /ad /b') do (
  7.   set "as=%%k"
  8.   for /f "delims=" %%i in ('dir /a /b !as!\thumb') do (
  9.       set /a n+=1
  10.       set /a sign2=n%%30
  11.       if !sign2! equ 1 (
  12.          cd.>"%%k_!sign1!.txt"
  13.          echo ^<tr^>>>"!as!_!sign1!.txt"
  14.       )
  15.       echo ^<td^>%%~nxi^</td^>>>"!as!_!sign1!.txt"
  16.       set /a sign3=n%%3
  17.       if !sign3! equ 0 (
  18.          echo ^</tr^>>>"!as!_!sign1!.txt"
  19.          if not !sign2! equ 0 echo ^<tr^>>>"!as!_!sign1!.txt"
  20.       )
  21.       set /a sign1=n/30+1
  22.   )
  23. if not !sign3! equ 0 echo ^</tr^>>>"%%k_!sign1!.txt"
  24. )
  25. echo 执行完毕!&pause>nul
复制代码

作者: ganjie    时间: 2009-1-4 03:15

不行呀,请看运行结果,因为要测试,我把30个限制改成了12个,如当前目录下有psp、nds两个文件夹,它们都有一个thumb文件夹,运行后得nds_1.txt、 nds_2.txt、psp_2.txt、psp_3.txt 四个文本,psp这个错误了,内容如下:
nds_1.txt
<tr>
<td>thum-21.jpg</td>
<td>thum-22.jpg</td>
<td>thum-23.jpg</td>
</tr>
<tr>
<td>thum-24.jpg</td>
<td>thum-25.jpg</td>
<td>thum-26.jpg</td>
</tr>
<tr>
<td>thum-27.jpg</td>
<td>thum-28.jpg</td>
<td>thum-29.jpg</td>
</tr>
<tr>
<td>thum-30.jpg</td>
<td>thum-31.jpg</td>
<td>thum-32.jpg</td>
</tr>


nds_2.txt
<tr>
<td>thum-33.jpg</td>
<td>thum-34.jpg</td>
<td>thum-35.jpg</td>
</tr>
<tr>

psp_2.txt
<td>thum-01.jpg</td>
<td>thum-02.jpg</td>
<td>thum-03.jpg</td>
</tr>
<tr>
<td>thum-04.jpg</td>
<td>thum-05.jpg</td>
<td>thum-06.jpg</td>
</tr>
<tr>
<td>thum-07.jpg</td>
<td>thum-08.png</td>
<td>thum-09.jpg</td>
</tr>

psp_3.txt
<tr>
<td>thum-10.jpg</td>
<td>thum-11.jpg</td>
<td>thum-12.jpg</td>
</tr>
<tr>
<td>thum-13.jpg</td>
<td>thum-14.jpg</td>
<td>thum-15.jpg</td>
</tr>
<tr>


[ 本帖最后由 ganjie 于 2009-1-4 03:59 编辑 ]
作者: lhjoanna    时间: 2009-1-4 11:24

你是说psp后的数字与里面的文件个数有问题吧,把set n=0和set sign1=1放进第一个for循环中看下。
作者: ganjie    时间: 2009-1-4 17:11

试测成功了,但还是有一个小小的问题,psp里的thumb有16个文件,结果psp就很完美了,nds里的thumb有15个文件,结果nds就多了一个<tr> ,请看下面
psp_1.txt 这个完美
<tr>
<td>thum-01.jpg</td>
<td>thum-02.jpg</td>
<td>thum-03.jpg</td>
</tr>
<tr>
<td>thum-04.jpg</td>
<td>thum-05.jpg</td>
<td>thum-06.jpg</td>
</tr>
<tr>
<td>thum-07.jpg</td>
<td>thum-08.png</td>
<td>thum-09.jpg</td>
</tr>
<tr>
<td>thum-10.jpg</td>
<td>thum-11.jpg</td>
<td>thum-12.jpg</td>
</tr>
psp_2.txt 这个也完美
<tr>
<td>thum-13.jpg</td>
<td>thum-14.jpg</td>
<td>thum-15.jpg</td>
</tr>
<tr>
<td>thum-36.jpg</td>
</tr>

nds_1.txt 这个完美
<tr>
<td>thum-21.jpg</td>
<td>thum-22.jpg</td>
<td>thum-23.jpg</td>
</tr>
<tr>
<td>thum-24.jpg</td>
<td>thum-25.jpg</td>
<td>thum-26.jpg</td>
</tr>
<tr>
<td>thum-27.jpg</td>
<td>thum-28.jpg</td>
<td>thum-29.jpg</td>
</tr>
<tr>
<td>thum-30.jpg</td>
<td>thum-31.jpg</td>
<td>thum-32.jpg</td>
</tr>
nds_2.txt 这个就多出了一个<tr>
<tr>
<td>thum-33.jpg</td>
<td>thum-34.jpg</td>
<td>thum-35.jpg</td>
</tr>
<tr>




[ 本帖最后由 ganjie 于 2009-1-4 17:54 编辑 ]
作者: lhjoanna    时间: 2009-1-4 19:29

知道了,不只是15会出现这种情况,凡是文件个数为3的倍数,都会这样。修改如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%k in ('dir /ad /b') do (
  4.   set n=0
  5.   set sign1=1
  6.   set "as=%%k"
  7.   for /f "delims=" %%i in ('dir /a /b !as!\thumb') do (
  8.       set /a n+=1
  9.       set /a sign2=n%%30,sign3=n%%3
  10.       if !sign2! equ 1 cd.>"%%k_!sign1!.txt"
  11.       if !sign3! equ 1 echo ^<tr^>>>"!as!_!sign1!.txt"
  12.       echo ^<td^>%%~nxi^</td^>>>"!as!_!sign1!.txt"
  13.       if !sign3! equ 0 echo ^</tr^>>>"!as!_!sign1!.txt"
  14.       set /a sign1=n/30+1
  15.   )
  16.   if not !sign3! equ 0 echo ^</tr^>>>"%%k_!sign1!.txt"
  17. )
  18. echo 执行完毕!&pause>nul
复制代码

作者: ganjie    时间: 2009-1-4 19:38

完美了,谢谢大大了!如果有时间请帮看看这个贴,已经发几天没有一个回复的,看来颇难文件名操作:对批量文件按名称排序并把文件名写入指定文件http://www.bathome.net/thread-2968-1-2.html
作者: ganjie    时间: 2009-1-5 01:10

大大,我还有问题呀,其实我想做的是一个缩略图网页批处理,所以还想加入一些内容,麻烦请再帮我看看,输出内容如下:
设 psp_3.txt
<table>
<tr>
<td>thum-01.jpg</td>
<td>thum-02.jpg</td>
<td>thum-03.jpg</td>
</tr>
<tr>
<td>thum-04.jpg</td>
<td>thum-05.jpg</td>
<td>thum-06.jpg</td>
</tr>
<tr>
<td>thum-07.jpg</td>
<td>thum-08.png</td>
<td>thum-09.jpg</td>
</tr>
<tr>
<td>thum-10.jpg</td>
<td>thum-11.jpg</td>
<td>thum-12.jpg</td>
</tr>

</table>
<上一页psp_2.html>psp_1.html psp_2.html  psp_3.html  psp_4.html  psp_5.html <psp_4.html 下一页>


解释:每个文本开头开个<table>    结尾加个</table>
<上一页>是按文件名排列后的这个文本的上一个文件名  
<下一页>  同理
黑色部分为5个文件名 为该文本文件名的左右各两个

[ 本帖最后由 ganjie 于 2009-1-5 05:17 编辑 ]




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