中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批量文件按名称排序并把文件名写入指定文件
作者:
标题: 批量文件按名称排序并把文件名写入指定文件 上一主题 | 下一主题
ganjie
初级用户





积分 49
发帖 37
注册 2007-5-8
状态 离线
『楼 主』:  批量文件按名称排序并把文件名写入指定文件

某文件夹下若干个文件,例如有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>


[ Last edited by ganjie on 2009-1-5 at 23:53 ]

2009-1-5 23:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
creda
新手上路





积分 12
发帖 10
注册 2008-12-30
状态 离线
『第 2 楼』:  

伙计能否告诉我,怎么读取文件夹中的文件名啊,再跟一个固定字符串进行判断。

比如 A文件夹 ,有 几个文件 ,让他们跟当前日期+0000 或当前日期+1200进行对比,如果对应就执行1 ,不对应执行2.

2009-1-6 12:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ahongguo
新手上路




积分 10
发帖 7
注册 2008-10-15
来自 河北沧州
状态 离线
『第 3 楼』:  

建议弄的字小一点不好吗 弄这大



DOS下燃起火热的电脑人生
2009-1-6 20:01
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (475073333)  编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  Re 2楼

有问题请单独发帖提问,你在别人的帖子里面跟帖提问的话,很少有人能看到你的问题,愿意回答问题的就更少了。



2009-1-6 21:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 5 楼』:  

搞了一天,终于好了!^_^


@echo off&setlocal enabledelayedexpansion
echo #>%temp%\fs.tmp
dir aa\*.* /b /a-d>>%temp%\fs.tmp
echo #>>%temp%\fs.tmp
type %temp%\fs.tmp
set test=0
set n=0
set var=0
for /f "delims=" %%i in (%temp%\fs.tmp) do (
        set "f5=!f4!"&set "e5=!e4!"
        set "f4=!f3!"&set "e4=!e3!"
        set "f3=!f2!"&set "e3=!e2!"
        set "f2=!f1!"&set "e2=!e1!"
        set f1=%%~ni
        if "%%i"=="#" (set e1=) else (set "e1=^<var^>!f1!^<tr^>!n!^</tr^>^</var^>")
        if !var! gtr !test! (
                set test=!var!
                >!f4!.txt echo !e5!!e4!!e3!!e2!!e3!
                >!f3!.txt echo !e4!!e4!!e3!!e2!!e2!
                >!f2!.txt echo !e3!!e4!!e3!!e2!!e1!
        )
        set /a var=n/3
        set /a n+=1
)
set /a var=(n-2)%%3
if !var! gtr 1 echo !e4!!e4!!e3!!e2!!e2!>!f3!.txt
if !var! gtr 0 echo !e3!!e4!!e3!!e2!!e1!>!f2!.txt
dir *.txt
del %temp%\fs.tmp
pause

[ Last edited by netbenton on 2009-1-8 at 01:01 ]

2009-1-8 00:57
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
ganjie
初级用户





积分 49
发帖 37
注册 2007-5-8
状态 离线
『第 6 楼』:  

楼上的,我测试了,没有什么反应呀,提示说找不到文件,是不是你这个%temp%要改成%cd%,可是我改了后也没有测试成功!

2009-1-8 18:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 7 楼』:  改红色部分



  Quote:
Originally posted by ganjie at 2009-1-8 18:10:
楼上的,我测试了,没有什么反应呀,提示说找不到文件,是不是你这个%temp%要改成%cd%,可是我改了后也没有测试成功!

@echo off&setlocal enabledelayedexpansion
echo #>%temp%\fs.tmp
dir aa\*.* /b /a-d>>%temp%\fs.tmp
echo #>>%temp%\fs.tmp
type %temp%\fs.tmp
set test=0
set n=0
set var=0

在红色部分指明你的目录和文件



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-9 01:02
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
ganjie
初级用户





积分 49
发帖 37
注册 2007-5-8
状态 离线
『第 8 楼』:  

经测试,输出文本的结果是我想要的内容,谢谢了,不过我不太理解您的编批算法和一些变量的意思,你能注释一下吗?授人鱼不如授人渔,烦麻一下!

2009-1-9 18:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 9 楼』:  

@echo off&setlocal enabledelayedexpansion
echo #>%temp%\fs.tmp
dir aa\*.* /b /a-d>>%temp%\fs.tmp
echo #>>%temp%\fs.tmp
type %temp%\fs.tmp
::a 以上取得排序后的目录列表,并在前后加"#", 在这里加pause可以看到结果

set test=0
set n=0
set var=0
for /f "delims=" %%i in (%temp%\fs.tmp) do (

::b
        set "f5=!f4!"&set "e5=!e4!"
        set "f4=!f3!"&set "e4=!e3!"
        set "f3=!f2!"&set "e3=!e2!"
        set "f2=!f1!"&set "e2=!e1!"
        set f1=%%~ni
::b 文件名及备写内容数组,执行一次,递进一次(f1,e1)->f2,e2)->f3,e3)->f4,e4)->f5,e5)

::c
        if "%%i"=="#" (set e1=) else (set "e1=^<var^>!f1!^<tr^>!n!^</tr^>^</var^>")
::c 根据文件转化成备写内容,为#写入空,处理前后的特殊

:: d
        if !var! gtr !test! (
                set test=!var!
                >!f4!.txt echo !e5!!e4!!e3!!e2!!e3!
                >!f3!.txt echo !e4!!e4!!e3!!e2!!e2!
                >!f2!.txt echo !e3!!e4!!e3!!e2!!e1!
        )
:: d 写入文件,三条一组 变量排列是按你的要求排的

::e
        set /a var=n/3
::e 只有是3的倍数,var才会发生改变

        set /a n+=1
)

::f 最后不足三条的,现在写入
set /a var=(n-2)%%3
if !var! gtr 1 echo !e4!!e4!!e3!!e2!!e2!>!f3!.txt
if !var! gtr 0 echo !e3!!e4!!e3!!e2!!e1!>!f2!.txt
dir *.txt
del %temp%\fs.tmp
pause



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-9 21:18
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
ganjie
初级用户





积分 49
发帖 37
注册 2007-5-8
状态 离线
『第 10 楼』:  

if "%%i"=="#" (set e1=) else (set "e1=^<var^>!f1!^<tr^>!n!^</tr^>^</var^>")
::c 根据文件转化成备写内容,为#写入空,处理前后的特殊

这句我不太理解,可以说得更详细吗?

2009-1-9 21:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 11 楼』:  

#是另外加入列表前后的,你要求的第一项和最后项不是特殊吗

set "e1=^<var^>!f1!^<tr^>!n!^</tr^>^</var^>"

set e1=^^^<var^^^>!f1!^^^<tr^^^>!n!^^^</tr^^^>^^^</var^^^>
的结果是一样的,你自己试试吧
再说下去我也说不出来了,水平有限



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-9 22:46
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
ganjie
初级用户





积分 49
发帖 37
注册 2007-5-8
状态 离线
『第 12 楼』:  

#是另外加入列表前后的?是不是这就是第一个和最后要输出的内容,举个例子看看!还有test!代表什么?  set /a var=(n-2)%%3这句,举个例子,想知道为何n-2,谢谢!

2009-1-9 22:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 13 楼』:  

#就是辅助处理前后特殊的,并不会生成#.txt文件,

test变量是为了三个一组输出设置的,如:abc与def各自有特殊关系

!var!大于!test! 才输出,而
set /a var=n/3
随n的变化,会使 var 增加,n与var的关系如下
n      var
0        0
1        0
3        1
4        1
6        2

set /a var=(n-2)%%3  取(n-2 )除以3的余数
就是用来处理不足一组的文件,因为在for里面是三个一组输出的,不足的还没有处理


至于n-2是因为在for里面是读到第四个文件时才有输出的,而输出后又加了1 如:
0 #

1 a
2 b
3 c

4 d
5 e
6 #
n+1
7
for出来后n=7
但只有
(n-2)%%3 =2
项是需要输出的
所以要n-2



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-9 23:36
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: