Board logo

标题: [文件操作] 文件名操作:对批量文件按名称排序并把文件名写入指定文件 [打印本页]

作者: ganjie    时间: 2009-1-2 14:01     标题: 文件名操作:对批量文件按名称排序并把文件名写入指定文件

几天前小弟发了个贴   http://www.bathome.net/thread-2951-1-1.html
某文件夹下若干个文件,例如有A至E 5个文件,按名称排序后读取文件名,把它们放入文本中,按文件名保存,如A就保存为A.txt,同理B就是B.txt,A.txt是第一个文件,内容为  <var>A</var> <var>B</var> <var>C</var>
B.txt 内容如下
<var>A</var> <var>B</var> <var>C</var>  
C.txt 内容如下
<var>B</var> <var>C</var> <var>D</var>
D.txt 内容如下
<var>C</var> <var>D</var> <var>E</var>
E.txt 内容如下
<var>C</var> <var>D</var> <var>E</var>

请注意看一下蓝色的部分,除了第一个和最后一个外,都是文本文件名的在中间,左边为按名称排序后的上一个右边为按名称排序后的下一个除第一个与最后一个外,下面的代码已经可以现实

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b /a-d *.*^|find /i /v "%~nx0"') do (
  3.    set str2=!str1!
  4.    set str1=!var!
  5.    set var=%%~ni
  6.    if defined str2 (
  7.    if not defined var1 (
  8.    set "var1=!str2!"
  9.    >"!str2!.txt" echo ^^^<var^^^>!str2!^^^</var^^^> ^^^<var^^^>!str1!^^^</var^^^> ^^^<var^^^>%%~ni^^^</var^^^>
  10. ) else (
  11.    >"!str2!.txt" echo ^^^<var^^^>!var1!^^^</var^^^> ^^^<var^^^>!str2!^^^</var^^^> ^^^<var^^^>!str1!^^^</var^^^>
  12.    set "var1=!str2!"
  13.    set "var2=!var1!"
  14. )))
  15. >"!str1!.txt" echo ^^^<var^^^>!str2!^^^</var^^^> ^^^<var^^^>!str1!^^^</var^^^> ^^^<var^^^>!var!^^^</var^^^>
  16. >"!var!.txt" echo ^^^<var^^^>!str2!^^^</var^^^> ^^^<var^^^>!str1!^^^</var^^^> ^^^<var^^^>!var!^^^</var^^^>
  17. pause
复制代码

现在小弟想修改输出的内容
设A.txt为第一个文件,内容为  <var>A<tr>1</tr></var> <var>B<tr>2</tr></var><var>C<tr>3</tr></var>  <var>B<tr>2</tr></var>  
B.txt 内容如下
<var>A<tr>1</tr></var> <var>A<tr>1</tr></var> <var>B<tr>2</tr></var> <var>C<tr>3</tr></var> <var>C<tr>3</tr></var>  

同理 C.txt内容如下
<var>B<tr>0</tr></var> <var>A<tr>1</tr></var> <var>B<tr>2</tr></var> <var>C<tr>3</tr></var>  <var>D<tr>4</tr></var>  

但 D.txt内容有点变
<var>C<tr>3</tr></var> <var>D<tr>4</tr></var>  <var>E<tr>5</tr>
</var>var>F<tr>6</tr></var> <var>E<tr>5</tr></var>
注意黑色的部分
E.txt
<var>D<tr>4</tr></var> <var>D<tr>4</tr></var>  <var>E<tr>5</tr> </var>var>F<tr>6</tr></var> <var>F<tr>6</tr></var>

F.txt
<var>E<tr>5</tr></var> <var>D<tr>4</tr></var>  <var>E<tr>5</tr> </var>var>F<tr>6</tr></var> <var>G<tr>7</tr></var>
可以看出A.txt和B.txt 、C.txt的黑色部分是ABC     D.txt和E.txt、F.txt 的黑色部分是DEF


红色为上一个文件名 蓝色为下一个文件名 数字为文件名按名称排序后的序号
只有第一个和最后一个有特殊

假设Z.txt最后一个文件,其内容如下
<var>Y<tr>25</tr></var> <var>X<tr>24</tr></var><var>Y<tr>25</tr></var> <var>Z<tr>26</tr></var>

作者: ganjie    时间: 2009-1-8 15:37

发了好几天的贴子了,没人回答,看来颇难,我也在其它论坛上发了,到了现在也没有人能回答,是不是这个问题已经超过了批处理的能力?
作者: Batcher    时间: 2009-1-8 16:20

有人给出方案了,但是你没有给出反应:
http://www.cn-dos.net/forum/viewthread.php?tid=45570
作者: ganjie    时间: 2009-1-8 16:50

哦,原来是这样,谢谢提醒!不过他的那个方案也没有成功,能帮我一下吗?

[ 本帖最后由 ganjie 于 2009-1-8 16:57 编辑 ]
作者: lhjoanna    时间: 2009-1-8 21:42

看到了楼主在http://www.bathome.net/viewthread.php?tid=2939&page=2#pid18383中的回复,最近忙着准备考试,也没来得及细看。今天看了一下,楼主的要求有一个问题:当文件个数不是3的倍数时,那么就不只是开头和结尾文件特殊,倒数第二个(文件个数除3余2)或者倒数第三个(文件个数除3余1)文件都特殊,对于此方面的要求楼主并没有提出,我也就无从写起,下面的程序如果文件个数为3的倍数则可以正确执行,如果不是则根据除3的余数最后一个或两个文件会出现出现一些小问题。楼主看下最后几个文件便知是什么问题。
    楼主在上面链接帖子中提出的<table>问题只要思考下,完全可以自己添加。如果实践后不成功再拿出代码来请大家分析。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d /on^|find /i /v "%~nx0"') do set "argument=!argument!%%i "
  4. set /a n1=1
  5. call :test !argument!
  6. set argu_fore=
  7. echo 执行完毕!
  8. pause>nul
  9. goto :eof
  10. :test
  11. set /a n2=n1+1
  12. set /a n3=n1+2
  13. set arg1=%1
  14. set arg2=%2
  15. set arg3=%3
  16. set arg4=%4
  17. for /l %%i in (1 1 3) do (
  18.    if not "!arg%%i!" equ "" (
  19.      cd.>!arg%%i!.txt
  20.      set /a num1=n%%i-1,num2=n%%i+1
  21.      if defined argu_fore (
  22.        set /p=^<var^><nul>>!arg%%i!.txt
  23.        call set /p=!argu_fore!<nul>>!arg%%i!.txt
  24.        echo ^<tr^>!num1!^</tr^>^<var^><nul>>!arg%%i!.txt
  25.      )
  26.        echo ^<var^>!arg1!^<tr^>!n1!^</tr^>^<var^>>>!arg%%i!.txt
  27.        echo ^<var^>!arg2!^<tr^>!n2!^</tr^>^<var^>>>!arg%%i!.txt
  28.        echo ^<var^>!arg3!^<tr^>!n3!^</tr^>^<var^>>>!arg%%i!.txt
  29.        set /a num=%%i+1
  30.      if not "!arg4!" equ "" (
  31.        set /p=^<var^><nul>>!arg%%i!.txt
  32.        call set /p=%%arg!num!%%<nul>>!arg%%i!.txt
  33.        echo ^<tr^>!num2!^</tr^>^<var^><nul>>!arg%%i!.txt
  34.      )
  35.        set argu_fore=!arg%%i!
  36.    )
  37. )
  38. set /a n1+=3
  39. shift&shift&shift
  40. if not "%1" equ "" goto test
复制代码

[ 本帖最后由 lhjoanna 于 2009-1-8 22:48 编辑 ]
作者: ganjie    时间: 2009-1-9 13:22

好意思哦,不知你要准备考试,上面的代码我几乎是不理解,等有空的时候,详细解释一下,好吗?
作者: lhjoanna    时间: 2009-1-9 13:30

恩,没事。代码楼主运行过了吗?结果如何?
作者: ganjie    时间: 2009-1-9 16:09

测试了,有一点问题,如有15个文件,前面12个都对了,就是在最后三个出错,如下:
thum-13.jpg.txt
<var>thum-12.jpg<tr>12</tr><var>
<var>thum-13.jpg<tr>13</tr><var>
<var>thum-14.jpg<tr>14</tr><var>
<var>thum-15.jpg<tr>15</tr><var>


thum-14.jpg.txt
<var>thum-13.jpg<tr>13</tr><var>
<var>thum-13.jpg<tr>13</tr><var>
<var>thum-14.jpg<tr>14</tr><var>
<var>thum-15.jpg<tr>15</tr><var>


thum-15.jpg.txt
<var>thum-14.jpg<tr>14</tr><var>
<var>thum-13.jpg<tr>13</tr><var>
<var>thum-14.jpg<tr>14</tr><var>
<var>thum-15.jpg<tr>15</tr><var>

不过我不太了解你编这个批的算法,和其中一些变量代表的意思,我之所以想要这个的输出结果就是为了配合我的网页相册的分页项,所以请你解释详细点,我好加以理解,然后才能融到我要的网页相册中!
还有一个,如果有16个文件,则前15个都对了,第16个错
thum-16.jpg.txt
<var>thum-15.jpg<tr>15</tr><var>
<var>thum-16.jpg<tr>16</tr><var>
<var><tr>17</tr><var>
<var><tr>18</tr><var>


如果有17个文件,则前15个都对了,第16和17个错
thum-16.jpg.txt
<var>thum-15.jpg<tr>15</tr><var>
<var>thum-16.jpg<tr>16</tr><var>
<var>thum-17.jpg<tr>17</tr><var>
<var><tr>18</tr><var>

thum-17.jpg.txt
<var>thum-16.jpg<tr>16</tr><var>
<var>thum-16.jpg<tr>16</tr><var>
<var>thum-17.jpg<tr>17</tr><var>
<var><tr>18</tr><var>


我在dos论坛那里也发了这个贴,你看一下他的回贴,他那个可以得到我想要的结果,不过我也不太理解了!

[ 本帖最后由 ganjie 于 2009-1-9 16:43 编辑 ]
作者: lhjoanna    时间: 2009-1-9 16:43

我修改了一下,上面的有些小问题,楼主再试下这个,但要求还是3的倍数。楼主没有说明如果不是3的倍数中间3个的取值有何规律性,我也就没有些此相关的代码。如果不是3的倍数,比如就像楼主说的A-Z,一共26个,除3余2。这样算来,最后三个中间的就是Y Z 以及未知,所以会出现问题,但是楼主说最后是中间的是X Y Z,有何规律性,如果除3余1的话(比如A-Y),那么又该如何写?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d /on^|find /i /v "%~nx0"') do set "argument=!argument!%%i "
  4. set /a n1=1
  5. call :test !argument!
  6. set argu_fore=
  7. echo 执行完毕!
  8. pause>nul
  9. goto :eof
  10. :test
  11. set /a n2=n1+1
  12. set /a n3=n1+2
  13. set arg1=%1
  14. set arg2=%2
  15. set arg3=%3
  16. set arg4=%4
  17. for /l %%i in (1 1 3) do (
  18.    if not "!arg%%i!" equ "" (
  19.      cd.>!arg%%i!.txt
  20.      set /a num1=n%%i-1,num2=n%%i+1
  21.      if defined argu_fore (
  22.        set /p=^<var^><nul>>!arg%%i!.txt
  23.        call set /p=!argu_fore!<nul>>!arg%%i!.txt
  24.        echo ^<tr^>!num1!^</tr^>^<var^><nul>>!arg%%i!.txt
  25.      )
  26.        echo ^<var^>!arg1!^<tr^>!n1!^</tr^>^<var^>>>!arg%%i!.txt
  27.        echo ^<var^>!arg2!^<tr^>!n2!^</tr^>^<var^>>>!arg%%i!.txt
  28.        echo ^<var^>!arg3!^<tr^>!n3!^</tr^>^<var^>>>!arg%%i!.txt
  29.        set /a num=%%i+1
  30.      if not "!arg4!" equ "" (
  31.        set /p=^<var^><nul>>!arg%%i!.txt
  32.        call set /p=%%arg!num!%%<nul>>!arg%%i!.txt
  33.        echo ^<tr^>!num2!^</tr^>^<var^><nul>>!arg%%i!.txt
  34.      ) else if %%i lss 3 (
  35.        set /p=^<var^><nul>>!arg%%i!.txt
  36.        call set /p=%%arg!num!%%<nul>>!arg%%i!.txt
  37.        echo ^<tr^>!num2!^</tr^>^<var^><nul>>!arg%%i!.txt
  38.      )
  39.        set argu_fore=!arg%%i!
  40.    )
  41. )
  42. set /a n1+=3
  43. shift&shift&shift
  44. if not "%1" equ "" goto test
复制代码

[ 本帖最后由 lhjoanna 于 2009-1-9 16:45 编辑 ]
作者: ganjie    时间: 2009-1-9 16:57

不行呀,如果有17个文件,则最后两个错了,根本没有18这个数字,却出现了
thum-16.jpg.txt
<var>thum-15.jpg<tr>15</tr><var>
<var>thum-16.jpg<tr>16</tr><var>
<var>thum-17.jpg<tr>17</tr><var>
<var><tr>18</tr><var>
<var>thum-17.jpg<tr>17</tr><var>

thum-17.jpg.txt
<var>thum-16.jpg<tr>16</tr><var>
<var>thum-16.jpg<tr>16</tr><var>
<var>thum-17.jpg<tr>17</tr><var>
<var><tr>18</tr><var>
<var><tr>18</tr><var>


如果有16个文件,则最后一个错,
thum-16.jpg.txt
<var>thum-15.jpg<tr>15</tr><var>
<var>thum-16.jpg<tr>16</tr><var>
<var><tr>17</tr><var>
<var><tr>18</tr><var>
<var><tr>17</tr><var>

谢谢大大了,请你看看http://www.cn-dos.net/forum/viewthread.php?tid=45570&pid=320089&page=1#pid320089
试运行一下,他那个bat,就清楚了,如果有时间帮我解释他那个bat一下,好吗?或是根据他那个改成你这种风格的!

[ 本帖最后由 ganjie 于 2009-1-9 17:12 编辑 ]
作者: lhjoanna    时间: 2009-1-9 17:18

我说了只适合于文件个数是3的倍数的情况啊,至于不是三的倍数的话中间的三个应该按什么来写?我看了你提供的帖子里的代码了,那是按照如果不是3的倍数则最后几个文件自动取最后三个作为中间内容,楼主要的是这样?他的仔细过程我没看,不过大概算法差不多,区别在于他的是把文件名写入临时文件fs.tmp,我的是把文件名作为参数传递给被调用的test函数。
作者: ganjie    时间: 2009-1-9 18:37

哦,不过他编的那个bat输出的内容就是我想要的,您考试完后能帮我注解一下他那个bat吗?还有如果可以的话,我想让你帮我写我想要的那样网页相册的bat,其实几个重要的细节我已经在论坛上得到解决了,就差如何把它们融合在一起了!因为在论坛上发的话,我觉得要发的内容太长,而且也不好让人理解,这是我的邮箱:[email]89022045@qq.com[/email] ,没有什么权力要求你帮我制作这个网页相册,但我还是抱着希望,你能帮我,其实就是写三个bat,分别生成3种内容。
作者: lhjoanna    时间: 2009-1-9 22:36

恩,可以。这几天考完试后我帮你看看。我的邮箱[email]lhjoanna@163.com[/email]。内容长的话可以先发来,我考试结束后帮你看。
作者: ganjie    时间: 2009-1-10 08:21

太好了!实在太感谢了!过几天后我才发到你的邮箱吧,祝你考试有个好成绩




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