中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-27 17:18
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]按照指定文本格式批量建立目录 查看 934 回复 10
楼 主 [讨论]按照指定文本格式批量建立目录 发表于 2008-11-21 18:16 ·  中国 上海 浦东新区 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
某朋友想做一个批处理,以完成他建立复杂的目录结构的要求
目录结果按某文本记录,类似这样的:

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 "^"' do goto :goon
goto :enext

:goon
::右边非数字起首,顶级目录,直接创建退出
for /f %%r in ('echo !right!^|findstr /r "^"' 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
2 发表于 2008-11-22 01:31 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
@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%!"
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
pooronce +4 2008-11-23 13:37
3 发表于 2008-11-22 03:36 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
被这题难住了,一度卡壳,看这样对吗?
@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...^_^
4 发表于 2008-11-22 14:28 ·  中国 浙江 嘉兴 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
回ls朋友,这个不确定,当然标准的来说是挨着的,但能处理这种异常是最好了
5 Re 4楼 发表于 2008-11-23 01:03 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
这个排序应该难不住 pusofalse 兄,呵呵。
6 发表于 2008-11-23 13:41 ·  中国 上海 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
Originally posted by pusofalse at 2008-11-22 03:36 AM:
被这题难住了,一度卡壳,看这样对吗?
@Echo Off & Setlocal EnableDelayedExpansion
Set /a y=0
For /f "Usebackq Delims=" %%a in ("%~dp0dirs.txt") do ...



好像不行,目录没套得住
7 发表于 2008-11-23 13:43 ·  中国 上海 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
Originally posted by tireless at 2008-11-22 01:31 AM:
@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"好点?
8 发表于 2008-11-23 14:03 ·  中国 江西 赣州 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
不过似乎遇到有单数字打头的目录可能会有问题,但应该不会有这种目录出现,字母倒是有可能的,是否比较处用"A"好点?

恩,换成 9 好一点:
if "!str:~%n%,1!" leq "9" goto loop

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

[ Last edited by tireless on 2008-11-23 at 14:05 ]
9 发表于 2008-11-23 20:43 ·  中国 上海 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
不同的行? 囧rz... 不懂
10 Re 9楼 发表于 2008-11-23 20:54 ·  中国 江西 赣州 安远县 电信
银牌会员
★★★★
积分 2,025
发帖 1,122
注册 2007-09-05 20:15
18年会员
UID 96653
性别 男
状态 离线
我是说,如果要增加一些判断,不如先你问下你那朋友 dirs.txt 的内容是否都是有规律的
11 发表于 2008-11-23 23:27 ·  中国 上海 电信
中级用户
★★
积分 484
发帖 250
注册 2007-06-05 23:33
19年会员
UID 90372
性别 男
状态 离线
当然完美的情况下都是深度遍历出来的,不过人工维护时还是有可能出现失误的
论坛跳转: