中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]按照指定文本格式批量建立目录
作者:
标题: [讨论]按照指定文本格式批量建立目录 上一主题 | 下一主题
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『楼 主』:  [讨论]按照指定文本格式批量建立目录

某朋友想做一个批处理,以完成他建立复杂的目录结构的要求
目录结果按某文本记录,类似这样的:

  Quote:
01电影
0101动作片
010101国内
01010101大陆
01010102港台
010102国外
01010201欧美
01010202日韩
0102动画片
010201国内
010202国外

要按照这里面的序号来判断创建出这样的目录来:
01电影\0101动作片\010101国内\01010102港台

我熬了很久做了一个方面,列在下面。觉得肯定有很多不足的,大家有兴趣的也来一起试一试吧,希望能有更多更好的解决方案出来
SETLOCAL ENABLEDELAYEDEXPANSION

for /f %%x in (dirs.txt) do call :circle "%%x"

goto :eof

:circle

        set "line=%~1"
        set "left=!line:~0,2!"
        set "right=!line:~2!"
        set dirs=
       
        ::左边不含有数字,行错误退出
        for /f %%r in ('echo !left!^|findstr /r "^[0-9][0-9]"') do goto :goon
        goto :enext
       
        :goon
        ::右边非数字起首,顶级目录,直接创建退出
        for /f %%r in ('echo !right!^|findstr /r "^[0-9][0-9]"') do goto :deepgoon
                set "!left!=!line!"
                set "dirs=!dirs!!line!"
                ::echo "!dirs!"
                md "!dirs!"
                goto :next
        :deepgoon
       
        if not defined !left! goto :enext
        for /f %%i in ('call call echo %%%left%%%') do set "t_t=%%i"
        set "dirs=!dirs!!t_t!\"
        set t_t=
        set "left=!left!!right:~0,2!"
        set "right=!right:~2!
        goto :goon
       
       
       
        :enext
        echo 此行数据有问题,跳过
        :next


2008-11-21 18:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 2 楼』:  


@echo off
setlocal EnableDelayedExpansion
for /f %%a in (dirs.txt) do (
  call :getnum %%a
)
pause & exit /b

:getnum
set n=
set str=%1
:loop
set /a n+=2
if "!str:~%n%,1!" lss "Z" goto loop
set num=!str:~,%n%!
set up=%num:~,-2%
set %num%=!%up%!\%1
md "G:!%num%!"


   此帖被 +4 点积分        点击查看详情   
评分人:【 pooronce 分数: +4  时间:2008-11-23 13:37


2008-11-22 01:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 3 楼』:  

被这题难住了,一度卡壳,看这样对吗?
@Echo Off & Setlocal EnableDelayedExpansion
Set /a y=0
For /f "Usebackq Delims=" %%a in ("%~dp0dirs.txt") do (
       set "var=%%a" & set "_Path="
       set /a x=0 & Call :Loop
       If !x! Leq !y! (set /a c=y-x
           For /L %%i in (0 1 !c!) do set "_Path=!_Path!..\"
       )
       set /a y=x
       cd "!_Path!" >nul & Md "%%a" & cd "%%a"
)
Pause & Exit /b
:Loop
If Defined var set /a x+=1 & set "var=%var:~2%" & Goto :Loop
另外楼主的样本中有无这样格式的数据?
01020301
01020302
0102030101
0102030202
01020301与0102030101中间隔着一行。

[ Last edited by pusofalse on 2008-11-22 at 03:46 ]



心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2008-11-22 03:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 4 楼』:  

回ls朋友,这个不确定,当然标准的来说是挨着的,但能处理这种异常是最好了

2008-11-22 14:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





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

这个排序应该难不住 pusofalse 兄,呵呵。



2008-11-23 01:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by pusofalse at 2008-11-22 03:36 AM:
被这题难住了,一度卡壳,看这样对吗?
[code]@Echo Off & Setlocal EnableDelayedExpansion
Set /a y=0
For /f "Usebackq Delims=" %%a in ("%~dp0dirs.txt") do  ...

好像不行,目录没套得住

2008-11-23 13:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by tireless at 2008-11-22 01:31 AM:
[code]@echo off
setlocal EnableDelayedExpansion
for /f %%a in (dirs.txt) do (
  call :getnum %%a
)
pause & exit /b

:getnum
set n=
set str=%1
:loop
set /a n+=2
if "!str:~%n%,1! ...

简结
set %num%=!%up%!%1\
这样就好了

不过似乎遇到有单数字打头的目录可能会有问题,但应该不会有这种目录出现,字母倒是有可能的,是否比较处用"A"好点?

2008-11-23 13:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 8 楼』:  



  Quote:
不过似乎遇到有单数字打头的目录可能会有问题,但应该不会有这种目录出现,字母倒是有可能的,是否比较处用"A"好点?

恩,换成 9 好一点:

  Quote:
if "!str:~%n%,1!" leq "9" goto loop

dirs.txt 里面的内容你问下你那个朋友是否有“不同”的行...

[ Last edited by tireless on 2008-11-23 at 14:05 ]

2008-11-23 14:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 9 楼』:  

不同的行? 囧rz...  不懂

2008-11-23 20:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 10 楼』:  Re 9楼

我是说,如果要增加一些判断,不如先你问下你那朋友 dirs.txt 的内容是否都是有规律的

2008-11-23 20:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 11 楼』:  

当然完美的情况下都是深度遍历出来的,不过人工维护时还是有可能出现失误的

2008-11-23 23:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: