标题: [挑战1] 目录最后一个名称的提取[ 难度:☆]
[打印本页]
作者: flyinspace
时间: 2007-4-30 09:42
标题: [挑战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 ]
作者: youxi01
时间: 2007-4-30 09:58
其实这个问题在论坛里也讨论过了。
测试代码如下:
@echo off
set "FolderPath=测 试\te st\tes t123\OK"
for /f "delims=" %%i in ("%FolderPath%") do echo %%~ni
pause>nul
作者: youxi01
时间: 2007-4-30 10:11
当然以上的代码利用了 %%~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"
)
作者: baomaboy
时间: 2007-4-30 10:13
哦 原来这样取,刚才我还以为要取得最后的有效路径呢,就是判断磁盘上此路径是否真实存在。
作者: youxi01
时间: 2007-4-30 10:16
如果要获得 文件夹 的层数的话,可能用第二种方法比较好。
::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"
)
作者: flyinspace
时间: 2007-4-30 13:00
对三楼的代码的讲解:
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 ]
作者: baomaboy
时间: 2007-4-30 13:07
Quote: |
Originally posted by flyinspace at 2007-4-30 13:00:
寒! 不好意思,我出题目的时候,忘记申明一些东西了。。
我原来的意思是对不确定的层数进行提取。。
例如: asdf\aasdf\adlj\als\adfa\adf
我们总 ... |
|
不一定是目录,那是甚么意思?
作者: youxi01
时间: 2007-4-30 13:15
也不是很明白他的意思,他的意思可能是还有些是文件吧。
或者那个目录有很多层,但是他想提取指定的层?
作者: flyinspace
时间: 2007-4-30 13:20
举个例子:
现在我们有一些东西要出售。。
前面是对这个东西的描叙。而最后一项是这个东西的价格。
前面的描叙项不定,而我们只提取最后一项。
这个是我出题的疏忽。。
下次再出题的时候,我会尽量注意的。。
作者: youxi01
时间: 2007-4-30 13:24
Quote: |
Originally posted by flyinspace at 2007-4-30 01:20 PM:
举个例子:
前面的描叙项不定,而我们只提取最后 ... |
|
越来越不明白,现在的代码不就是提取最后一项吗?
如果要提取指定层数,也很简单。
在第二种办法的基础上,启用延迟变量,然后加个if 检测 :
if !num! gtr ... &... & goto :eof
作者: flyinspace
时间: 2007-4-30 13:28
呵呵,是我表达出了问题:)
不好意思。。
因为第一次组织这样的活动。。难免有考虑不周的地方。。请原谅。。
还有youxi01 你的代码已经写得很好了。。
真不好意思。。
作者: youxi01
时间: 2007-4-30 13:34
其实,你才最值得奖励。
我们应该为你的 努力 加油!!
说实话,提一些有意义的问题,然后大家讨论解决,确实有助于提高论坛人气,也有助于一些新手快速成长起来!当然我自己也是新手,努力学习中...
作者: baomaboy
时间: 2007-4-30 13:40
唉 第一次经历 难免,
就算路径最后取得的是“我是程序.exe”也不说明它不是文件夹啊,"我是程序.exe"怎么不能做文件夹名吗!
其实从一开始 我都一相情愿的认为 该贴的要求是:
取得(验证)aaa=c:\windows\system32\playuo\cndos\asd adf中的最后有效路径,也就是说验证aaa这个路径中的最后有效路径,如果cndos和asd adf这两个文件夹都不存在的话,最后返回的结果应该是playuo
作者: flyinspace
时间: 2007-4-30 13:54
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 ]
作者: notepad
时间: 2007-5-1 02:01
用不了啊 `````
作者: flyinspace
时间: 2007-5-1 02:15
Quote: |
Originally posted by notepad at 2007-4-30 01:01 PM:
用不了啊 ````` |
|
什么意思???
作者: lililulula
时间: 2007-5-1 04:37
Quote: |
@echo off
for /f "tokens=* delims=" %%i in ('cd') do (
set "fdname"="%%i"
call :GetFdName %fdname%
)
:GetFdName
for /f "tokens=1,* delims=\" %%j in ("%~1") do (
if "%%k"=="" echo %%j&&pause&&goto :eof
call :GetFdName %%k
) |
|
我改了下,我让它显示当前所在目录文件夹名为何fdname无法传递到getfdname里?如果我直接让它传递%%i的话碰到有空格的文件会不完全显示,所以我要设置fdname传递给getfdname
作者: lililulula
时间: 2007-5-1 05:50
要5.1了 预祝大家节日快乐 顺便来的人帮我看看问题啊 谢谢了
作者: zhoushijay
时间: 2007-5-1 05:57
@echo off
for /f "delims=" %%i in ("c:\aa\bb\cc") do (
echo %%~nxi
)
pause
作者: flyinspace
时间: 2007-5-1 06:10
Quote: |
Originally posted by zhoushijay at 2007-4-30 04:57 PM:
@echo off
for /f "delims=" %%i in ("c:\aa\bb\cc") do (
echo %%~nxi
)
pause |
|
这个怪我先前没有考虑周到。在发贴的时候忘记写下来了。。。
使用了 for 的特殊参数。。
我们的要求是不使用 这些特殊参数。
作者: slore
时间: 2007-5-1 13:24
居然没有用VBS的?
作者: baomaboy
时间: 2007-5-1 16:24
Set WshSHell = WScript.CreateObject("WScript.Shell")
FP="c:\aaa\bbb\ccc"
FPArr=split(FP,"\")
For i=1 To UBound(FPArr)
FPTest = FPArr(i)
Next
WshSHell.popup "最终目录:"&vbcrlf&FPTest
Set WshSHell = Nothing
WScript.Quit(0)
作者: slore
时间: 2007-5-1 16:43
Set WshSHell = WScript.
CreateObject(
"WScript.Shell")
FP=
"c:\aaa\bbb\ccc"
FPArr=
Split(FP,
"\")
For i=1
To UBound(FPArr)
FPTest = FPArr(i)
Next
WshSHell.popup
"最终目录:"&vbcrlf&FPTest
Set WshSHell =
Nothing
WScript.Quit(0)
MsgBox FPArr(
UBound(FPArr))不可以么?
InstrRev()不行么?
FP =
"c:\aaa\bbb\ccc"
FPArr =
Split(FP,
"\")
MsgBox FPArr(
UBound(FPArr))
Pos=
InstrRev(FP,
"\")+1
MsgBox Mid(FP,Pos,(
Len(FP) -
InstrRev(FP,
"\")))
[
Last edited by slore on 2007-5-1 at 03:56 AM ]
作者: baomaboy
时间: 2007-5-1 17:04
不可以么?
不行么?
FP或者FPArr还要吗?
作者: slore
时间: 2007-5-1 17:06
你的循环的意义何在?
作者: baomaboy
时间: 2007-5-1 17:40
用在此处确实无意义,不过追究的话连FP都没存在的意义了
作者: zerocq
时间: 2007-5-1 18:10
用vbs的split函数按/分割字符串
然后len函数逐个检测行不
作者: lililulula
时间: 2007-5-8 09:28
Quote: |
@echo off
for /f "tokens=* delims=" %%i in ('cd') do (
set "fdname"="%%i"
call :GetFdName %fdname%
)
:GetFdName
for /f "tokens=1,* delims=\" %%j in ("%~1") do (
if "%%k"=="" echo %%j&&pause&&goto :eof
call :GetFdName %%k
)
我改了下,我让它显示当前所在目录文件夹名为何fdname无法传递到getfdname里?如果我直接让它传递%%i的话碰到有空格的文件会不完全显示,所以我要设置fdname传递给getfdname |
|
5,1节前的问题,还是希望知道下原因,或者告诉我怎么解决含空格的文件名显示方法,如下例显示当前目录名时候如目录名含有空格则显示不完全.
Quote: |
@echo off
for /f "tokens=* delims=" %%i in ('cd') do (
call :GetFdName %%i
)
:GetFdName
for /f "tokens=1,* delims=\" %%j in ("%~1") do (
if "%%k"=="" echo %%j&&pause&&goto :eof
call :GetFdName %%k
) |
|
[
Last edited by lililulula on 2007-5-8 at 11:13 AM ]
作者: xtanbmy
时间: 2008-4-7 16:40
标题: 为你的 努力 加油!!
为你的 努力 加油!!
说实话,提一些有意义的问题,然后大家讨论解决,确实有助于提高论坛人气,也有助于一些新手快速成长起来!当然我自己也是新手,努力学习中...
为你的 努力 加油!!
作者: HAT
时间: 2008-4-8 05:38
似乎很久之前讨论过这个问题
作者: bat-zw
时间: 2008-4-8 09:08
好贴子,学习了,顶!!!
作者: ansipeter
时间: 2008-4-8 10:13
如果说单纯提取一个路径最后一段的话,我觉得用以下代码足可
@echo off&setlocal
set "aaa=c:\windows\system32\playuo\cndos\asd adf"
for %%? in ("%aaa:\=" "%") do set cc=%%~?
echo.%cc%