中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何获得文件的上一层目录名字
作者:
标题: [已结]如何获得文件的上一层目录名字 取消高亮 | 上一主题 | 下一主题
fry82lau
新手上路





积分 12
发帖 4
注册 2006-4-5
状态 离线
『楼 主』:  [已结]如何获得文件的上一层目录名字

需要打印jpg文件上一层目录的名字
用参数%%~pc只获得整个路径
求直接获得上一层目录的名字的参数,或者处理路径字符串获得上一层目录名字的函数,谢谢了!

语句如下:
for /r %%c in (*.jpg) do echo %%~pc >> 内容.txt

[ Last edited by willsort on 2006-6-26 at 14:04 ]

2006-4-5 12:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 2 楼』:  


@echo off
for /r %%c in (*.jpg) do call :began %%~pc
exit

:began
set cxs=%1
set cxs=%cxs:\= %
call :end %cxs%
goto :eof

:end
set tmp1=%2
if defined tmp1 shift && goto end
echo %1 >>内容.txt
goto :eof
基本上能实现,不过细节方面自己修改。

2006-4-5 13:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 3 楼』:  

真的很高明!



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2006-4-5 18:21
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 4 楼』:  

过奖了,只是写了个大致,连最基本的过滤掉重新的项都没有,不过并不是什么问题,只要在倒数第二行前面加个findstr语句就行了;另外就是如果目录名中包含空格的话也会出错,如果用另外一种方法的话就可以避免这种情况,不过那样效率会低很多而且要复杂很多,至于防止出现这种错误,其实也不难,只要根据情况在把/替换为空格的时候改成替换引号加空格(" )就行了。

2006-4-5 21:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
doscc
中级用户




积分 256
发帖 93
注册 2006-3-26
来自 广东
状态 离线
『第 5 楼』:  


请问2楼 兄弟
set cxs=%cxs:\= %
这一句是什么意思啊!
就是这句 %cxs:\= %

还有这句:
if defined tmp1 shift && goto end

谢谢!
[ Last edited by doscc on 2006-4-5 at 22:51 ]

2006-4-5 22:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 6 楼』:  

set cxs=%cxs:\= % rem 替换%cxs%中的符号\为空格
if defined tmp1 shift && goto end rem 如果定义了tmp1则把参数依次前移一位,%3变%2,%2变%1,依此类推。
例如:
set cxs=abcde
set cxs=%cxs:e=f%  rem %cxs% == abcdf

2006-4-5 23:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 7 楼』:  

Re fry82lau:

      从你顶楼中的说明程序来看,你似乎想实现的是打印某一路径下所有包含JPG文件的目录及子目录的名称。这需要考虑以下问题,搜索路径是否包含子目录,如果包含则子目录是否存在多级,如果存在多级则同名不同路径的子目录如何处理?

以下代码实现打印搜索路径下含有JPG文件的一级子目录的目录名
for /f %%d in ('dir /ad /b') do if exist "%%d\*.jpg" echo %%d >>内容.txt

以下代码实现打印搜索路径下含有JPG文件的多级目录及子目录的路径
for /r /d %%d in (*.*) do if exist "%%d\*.jpg" echo %%d >>内容.txt

而如果仅打印目录名,可以根据2楼的程序略作修改,将其中的for一句替换为
for /r /d %%d in (*.*) do if exist "%%d\*.jpg" call :began %%d

至于3742668提到的另外一种方法,猜想是使用set进行逆序探测。实现如下:
@echo off & setlocal EnableDelayedExpansion
for /r /d %%d in (*.*) do if exist "%%d\*.jpg" call :GetDirName %%d
goto:eof

:GetDirName
set pn=%~f1
for /l %%d in (1,1,256) do if "!pn:~-%%d,1!"=="\" (goto:out) else (set dn=!pn:~-%%d,1!!dn!)
:out
echo %dn% >>内容.txt
set dn=




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-4-6 02:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fry82lau
新手上路





积分 12
发帖 4
注册 2006-4-5
状态 离线
『第 8 楼』:  

学到很多东西啊!谢谢各位啦!

2006-4-6 14:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fry82lau
新手上路





积分 12
发帖 4
注册 2006-4-5
状态 离线
『第 9 楼』:  还有问题

我还是把我最终的目的说说吧。
1。批处理文件和许多存放jpg的文件夹在同一目录下;
2。运行批处理自动生成html代码
如下所示只是获得了jpg文件名,还想连jpg所在文件夹名字也加进去。

for /r %%c in (*.jpg) do echo ^<IMG src="./up/uploadpic/%%~nc.jpg" width=841 border=0^> >> 内容.txt

还有一个问题,由for扫描的jpg文件名序列好像是文件在FAT的存放的顺序,如何能够得到按照文件名排序的序列。

在此先谢过各位高手啦!!谢谢!!

2006-4-6 15:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 10 楼』:  

知我者willsort也。
@echo off
for /f %%i in ('"dir /a /s /b *.jpg"') do call :next "%%i"
goto :eof

:next
set jpg=%1
set cd1=%cd:\=/%
set jpg=%jpg:\=/%
rem echo %%jpg:%cd1%=%% | findstr .
for /f %%j in ('"echo %%jpg:%cd1%=%% | findstr . "') do set last=%%j
set last=%last:"=%
echo ^<IMG src="./up/uploadpic/%last%" width=841 border=0^> >> 内容.txt
goto :eof
楼主你试试吧。
我真傻,真的,居然开始没有想到用%cd%;
我真傻,真的,居然认为开始的那种方法效率是最高的;




2006-4-6 18:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 11 楼』:  

Re 3742668:

      起先就猜测,楼主试图获得的应该是匹配目录相对于搜索路径(此处为当前路径)的相对路径,而并非是指目录名,因为这种情况更为符合常情,而且也不存在同名不同路径的目录问题;只是楼主并未提到自己的设计初衷,所以无从确定,只好"就是论是"。现在看来,这个猜测是正确的了,所以兄的早期代码未使用%cd%我认为是合理的。

      根据楼主 9 楼的描述,dir 需要加上 /on 的开关参数,而for需要加上 "delims=" 的选项参数;至于兄使用 echo %%jpg:%cd1%=%% | findstr . 来实现变量的嵌套到是我未曾发现的技巧,通常我会使用生成中间临时代码(DOS)或者启用变量延迟扩展(CMD)的方法。下面的代码算是对10楼程序的补充。
@echo off & setlocal EnableDelayedExpansion
for /f "delims=" %%i in ('"dir /a/s/b/on *.jpg"') do (
    set jpg=%%~fi
    set jpg=!jpg:%cd%\=!
    set jpg=!jpg:\=/!
    echo ^<IMG src="./up/uploadpic/!jpg!" width=841 border=0^> >> 内容.txt
)
[ Last edited by willsort on 2006-4-6 at 21:39 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-4-6 21:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fry82lau
新手上路





积分 12
发帖 4
注册 2006-4-5
状态 离线
『第 12 楼』:  基本实现功能了,谢谢willsort和3742668

使用10楼的代码,再加上"delims=" 和 “/on ”参数,
即 for /f  "delims="  %%i in ('"dir /a /s /b /on *.jpg"') do call :next "%%i"
就实现功能了,虽然速度好像慢了点。
至于11楼的代码也实现功能了,速度会相对快一点。

代码中还有一些不明白的地方,特别是那些参数,不知道大虾们有没有相关的资料介绍,参考书籍也可以。再次谢过!

2006-4-7 13:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qdcr
初级用户





积分 120
发帖 32
注册 2006-6-19
状态 离线
『第 13 楼』:  

不知道对于已结的问题,还能不能回复:

to willsort版主 :

@echo off & setlocal EnableDelayedExpansion
for /f "delims=" %%i in ('"dir /a/s/b/on *.jpg"') do (
    set jpg=%%~fi
    set jpg=!jpg:%cd%\=!
    set jpg=!jpg:\=/!
    echo ^<IMG src="./up/uploadpic/!jpg!" width=841 border=0^> >> 内容.txt
)

非常好,但是用到了延迟扩展,而延迟扩展并不是对任意一种版本的cmd都支持,请问如何不使用延迟扩展而实现同样的功能?谢谢

2006-7-7 12:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: