标题: [文件操作] 文件名操作:对批量文件按名称排序并把文件名写入指定文件 [打印本页]
作者: 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>
请注意看一下蓝色的部分,除了第一个和最后一个外,都是文本文件名的在中间,左边为按名称排序后的上一个,右边为按名称排序后的下一个,除第一个与最后一个外,下面的代码已经可以现实
-
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.*^|find /i /v "%~nx0"') do (
- set str2=!str1!
- set str1=!var!
- set var=%%~ni
- if defined str2 (
- if not defined var1 (
- set "var1=!str2!"
- >"!str2!.txt" echo ^^^<var^^^>!str2!^^^</var^^^> ^^^<var^^^>!str1!^^^</var^^^> ^^^<var^^^>%%~ni^^^</var^^^>
- ) else (
- >"!str2!.txt" echo ^^^<var^^^>!var1!^^^</var^^^> ^^^<var^^^>!str2!^^^</var^^^> ^^^<var^^^>!str1!^^^</var^^^>
- set "var1=!str2!"
- set "var2=!var1!"
- )))
- >"!str1!.txt" echo ^^^<var^^^>!str2!^^^</var^^^> ^^^<var^^^>!str1!^^^</var^^^> ^^^<var^^^>!var!^^^</var^^^>
- >"!var!.txt" echo ^^^<var^^^>!str2!^^^</var^^^> ^^^<var^^^>!str1!^^^</var^^^> ^^^<var^^^>!var!^^^</var^^^>
- 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>问题只要思考下,完全可以自己添加。如果实践后不成功再拿出代码来请大家分析。- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d /on^|find /i /v "%~nx0"') do set "argument=!argument!%%i "
- set /a n1=1
- call :test !argument!
- set argu_fore=
- echo 执行完毕!
- pause>nul
- goto :eof
-
- :test
- set /a n2=n1+1
- set /a n3=n1+2
- set arg1=%1
- set arg2=%2
- set arg3=%3
- set arg4=%4
- for /l %%i in (1 1 3) do (
- if not "!arg%%i!" equ "" (
- cd.>!arg%%i!.txt
- set /a num1=n%%i-1,num2=n%%i+1
- if defined argu_fore (
- set /p=^<var^><nul>>!arg%%i!.txt
- call set /p=!argu_fore!<nul>>!arg%%i!.txt
- echo ^<tr^>!num1!^</tr^>^<var^><nul>>!arg%%i!.txt
- )
- echo ^<var^>!arg1!^<tr^>!n1!^</tr^>^<var^>>>!arg%%i!.txt
- echo ^<var^>!arg2!^<tr^>!n2!^</tr^>^<var^>>>!arg%%i!.txt
- echo ^<var^>!arg3!^<tr^>!n3!^</tr^>^<var^>>>!arg%%i!.txt
- set /a num=%%i+1
- if not "!arg4!" equ "" (
- set /p=^<var^><nul>>!arg%%i!.txt
- call set /p=%%arg!num!%%<nul>>!arg%%i!.txt
- echo ^<tr^>!num2!^</tr^>^<var^><nul>>!arg%%i!.txt
- )
- set argu_fore=!arg%%i!
- )
- )
- set /a n1+=3
- shift&shift&shift
- 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),那么又该如何写?- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d /on^|find /i /v "%~nx0"') do set "argument=!argument!%%i "
- set /a n1=1
- call :test !argument!
- set argu_fore=
- echo 执行完毕!
- pause>nul
- goto :eof
- :test
- set /a n2=n1+1
- set /a n3=n1+2
- set arg1=%1
- set arg2=%2
- set arg3=%3
- set arg4=%4
- for /l %%i in (1 1 3) do (
- if not "!arg%%i!" equ "" (
- cd.>!arg%%i!.txt
- set /a num1=n%%i-1,num2=n%%i+1
- if defined argu_fore (
- set /p=^<var^><nul>>!arg%%i!.txt
- call set /p=!argu_fore!<nul>>!arg%%i!.txt
- echo ^<tr^>!num1!^</tr^>^<var^><nul>>!arg%%i!.txt
- )
- echo ^<var^>!arg1!^<tr^>!n1!^</tr^>^<var^>>>!arg%%i!.txt
- echo ^<var^>!arg2!^<tr^>!n2!^</tr^>^<var^>>>!arg%%i!.txt
- echo ^<var^>!arg3!^<tr^>!n3!^</tr^>^<var^>>>!arg%%i!.txt
- set /a num=%%i+1
- if not "!arg4!" equ "" (
- set /p=^<var^><nul>>!arg%%i!.txt
- call set /p=%%arg!num!%%<nul>>!arg%%i!.txt
- echo ^<tr^>!num2!^</tr^>^<var^><nul>>!arg%%i!.txt
- ) else if %%i lss 3 (
- set /p=^<var^><nul>>!arg%%i!.txt
- call set /p=%%arg!num!%%<nul>>!arg%%i!.txt
- echo ^<tr^>!num2!^</tr^>^<var^><nul>>!arg%%i!.txt
- )
- set argu_fore=!arg%%i!
- )
- )
- set /a n1+=3
- shift&shift&shift
- 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 |