中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [挑战1] 目录最后一个名称的提取[ 难度:☆]
« [1] [2] [3] »
作者:
标题: [挑战1] 目录最后一个名称的提取[ 难度:☆] 上一主题 | 下一主题
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『楼 主』:  [挑战1] 目录最后一个名称的提取[ 难度:☆]

我们这一期的题目 :目录最后一个名称的提取

因为任意目录的名称都不一样。。但都满足于

c:\aaa\bbb\ccc

的格式,那么我们的要求就是 提出 ccc。

这个格式可以通过 dir /b /s /ad 来获取。

      可以使用 vbs 来提取
但不得通过第三方工具。。。。。。。。。。。。。。。。。。。。
挑战人的关键字: set /a ,变量延迟 , if not defined

不得使用:for 或 call 时 的特殊参数。。例如 %~nxi 之类的。

  Quote:
set "aaa=c:\windows\system32\playuo\cndos\asd adf"
set /a "count=0","count1=0"
set "FileName="

for /f "tokens=* " %%i in ("%aaa%") do (
        set str=%%~i
        for /l %%a in (0,1,255) do if "!str:~%%a,1!"=="" if not defined len set len=%%a
        for /l %%a in (0,1,255) do if "!str:~%%a,1!"=="\" set /a count+=1
        for /l %%a in (0,1,255) do (
                set abc=!str:~%%a,1!
                if "!count!"=="!count1!" (
                        set /a "lenflag=!len!-%%a"
                        if not defined FileName call :GetName "!lenflag!" "%%a"
                        )
                if "!abc!"=="\" set /a count1=!count1!+1
                )
        echo 在%aaa%目录中
        echo 提取的文件夹名为:"!FileName!"
        )
goto :END
:GetName _len_ _len_
        set "parm1=%~1"
        set "parm2=%~2"
        set "FileName=!str:~%parm2%,%parm1%!
        goto :EOF
:END

pause

[ Last edited by flyinspace on 2007-4-30 at 05:03 PM ]

   此帖被 +8 点积分        点击查看详情   
评分人:【 youxi01 分数: +8  时间:2007-4-30 13:31




知,不觉多。不知,乃求知
2007-4-30 09:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 2 楼』:  

其实这个问题在论坛里也讨论过了。

测试代码如下:
@echo off

set "FolderPath=测   试\te st\tes t123\OK"

for /f "delims=" %%i in ("%FolderPath%") do echo %%~ni

pause>nul


2007-4-30 09:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 3 楼』:  

当然以上的代码利用了 %%~ni的特殊性。
其实,还有一种思路,就是利用递归方法来获得 文件夹 名,测试代码如下:
@echo off
set "FolderPath=测   试\te st\tes t123\OK"
call :GetFdName "%FolderPath%"

pause>nul

:GetFdName
   for /f "delims=\ tokens=1,*" %%i in ("%~1") do (
       if "%%j"=="" echo %%i & goto :eof
       call :GetFdName "%%j"
)


   此帖被 +3 点积分      点击查看详情   
评分人:【 flyinspace 分数: +3  时间:2007-4-30 13:01


2007-4-30 10:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 4 楼』:  

哦 原来这样取,刚才我还以为要取得最后的有效路径呢,就是判断磁盘上此路径是否真实存在。



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-4-30 10:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 5 楼』:  

如果要获得 文件夹 的层数的话,可能用第二种方法比较好。
::code by youxi01@cn-dos.net
::获取文件夹的名称及层数

@echo off
set "FolderPath=测   试\te st\tes t123\OK"
call :GetFdName "%FolderPath%"

pause>nul

:GetFdName
   for /f "delims=\ tokens=1,*" %%i in ("%~1") do (
       set/a num+=1
       if "%%j"=="" echo 文件夹名:%%i & call echo 处于第%%num%%层 & goto :eof
       call :GetFdName "%%j"
)


2007-4-30 10:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 6 楼』:  

对三楼的代码的讲解:

  Quote:
@echo off
set "FolderPath=测   试\te st\tes t123\OK"
call :GetFdName "%FolderPath%" || rem 使用子程序。。

pause>nul

:GetFdName
   for /f "delims=\ tokens=1,*" %%i in ("%~1") do (
       if "%%j"=="" echo %%i & goto :eof
       call :GetFdName "%%j"
)

上面的是这个代码的精髓所在。。不停的把
a\b\c\d\e\f 的形式转换成
a 和 b\c\d\e\f
b 和 c\d\e\f
c 和 d\e\f
d 和 e\f
e 和 f
f  和 空。。

若后面一个数为空,则 %%i 就是所需要的目录名。

代码实在比我高百倍:)呵呵。。。

下一期难度会提高。。敬请各位高手关注。。

[ Last edited by flyinspace on 2007-4-30 at 12:14 AM ]



知,不觉多。不知,乃求知
2007-4-30 13:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by flyinspace at 2007-4-30 13:00:
寒!  不好意思,我出题目的时候,忘记申明一些东西了。。

我原来的意思是对不确定的层数进行提取。。

例如: asdf\aasdf\adlj\als\adfa\adf

我们总 ...

不一定是目录,那是甚么意思?



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-4-30 13:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 8 楼』:  

也不是很明白他的意思,他的意思可能是还有些是文件吧。
或者那个目录有很多层,但是他想提取指定的层?

2007-4-30 13:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 9 楼』:  

举个例子:

现在我们有一些东西要出售。。

前面是对这个东西的描叙。而最后一项是这个东西的价格。

前面的描叙项不定,而我们只提取最后一项。

这个是我出题的疏忽。。

下次再出题的时候,我会尽量注意的。。



知,不觉多。不知,乃求知
2007-4-30 13:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by flyinspace at 2007-4-30 01:20 PM:
举个例子:
前面的描叙项不定,而我们只提取最后 ...

越来越不明白,现在的代码不就是提取最后一项吗?
如果要提取指定层数,也很简单。
在第二种办法的基础上,启用延迟变量,然后加个if 检测 :
if !num! gtr ... &... &  goto :eof

2007-4-30 13:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 11 楼』:  

呵呵,是我表达出了问题:)

     不好意思。。

因为第一次组织这样的活动。。难免有考虑不周的地方。。请原谅。。

还有youxi01 你的代码已经写得很好了。。

真不好意思。。



知,不觉多。不知,乃求知
2007-4-30 13:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
youxi01
高级用户




积分 846
发帖 247
注册 2006-10-27
来自 湖南==》广东
状态 离线
『第 12 楼』:  

其实,你才最值得奖励。
我们应该为你的 努力 加油!!
说实话,提一些有意义的问题,然后大家讨论解决,确实有助于提高论坛人气,也有助于一些新手快速成长起来!当然我自己也是新手,努力学习中...

2007-4-30 13:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 13 楼』:  

唉 第一次经历 难免,
就算路径最后取得的是“我是程序.exe”也不说明它不是文件夹啊,"我是程序.exe"怎么不能做文件夹名吗!
其实从一开始 我都一相情愿的认为 该贴的要求是:
取得(验证)aaa=c:\windows\system32\playuo\cndos\asd adf中的最后有效路径,也就是说验证aaa这个路径中的最后有效路径,如果cndos和asd adf这两个文件夹都不存在的话,最后返回的结果应该是playuo



好多菩提树,好多明镜台。本来好多物,好多的尘埃。
2007-4-30 13:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 14 楼』:  



  Quote:
Originally posted by baomaboy at 2007-4-30 12:40 AM:
唉 第一次经历 难免,
就算路径最后取得的是“我是程序.exe”也不说明它不是文件夹啊,"我是程序.exe"怎么不能做文件夹名吗!
其实从一开始 ...

呵呵。你的这个办法很好啊。。

完全可以按照这个来嘛:)

这个完全可以做下一期的挑战题目嘛:)

[ Last edited by flyinspace on 2007-4-30 at 12:59 AM ]



知,不觉多。不知,乃求知
2007-4-30 13:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
notepad
新手上路




积分 10
发帖 4
注册 2007-4-20
状态 离线
『第 15 楼』:  

用不了啊 `````

2007-5-1 02:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: