标题: [讨论]按照指定文本格式批量建立目录
[打印本页]
作者: pooronce
时间: 2008-11-21 18:16
标题: [讨论]按照指定文本格式批量建立目录
某朋友想做一个批处理,以完成他建立复杂的目录结构的要求
目录结果按某文本记录,类似这样的:
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
作者: tireless
时间: 2008-11-22 01:31
@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%!"
作者: pusofalse
时间: 2008-11-22 03:36
被这题难住了,一度卡壳,看这样对吗?
@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 ]
作者: pooronce
时间: 2008-11-22 14:28
回ls朋友,这个不确定,当然标准的来说是挨着的,但能处理这种异常是最好了
作者: HAT
时间: 2008-11-23 01:03
标题: Re 4楼
这个排序应该难不住 pusofalse 兄,呵呵。
作者: pooronce
时间: 2008-11-23 13:41
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 ... |
|
好像不行,目录没套得住
作者: pooronce
时间: 2008-11-23 13:43
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"好点?
作者: tireless
时间: 2008-11-23 14:03
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 ]
作者: pooronce
时间: 2008-11-23 20:43
不同的行? 囧rz... 不懂
作者: tireless
时间: 2008-11-23 20:54
标题: Re 9楼
我是说,如果要增加一些判断,不如先你问下你那朋友 dirs.txt 的内容是否都是有规律的
作者: pooronce
时间: 2008-11-23 23:27
当然完美的情况下都是深度遍历出来的,不过人工维护时还是有可能出现失误的