中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-10 15:51
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,255 会员排行
DOS批处理 & 脚本技术(批处理室) » [已结]如何获得文件的上一层目录名字
可打印版本  3,720 / 12
第1楼 fry82lau 发表于 2006-04-05 12:01
新手上路 发帖 4 积分 12
[已结]如何获得文件的上一层目录名字
需要打印jpg文件上一层目录的名字
用参数%%~pc只获得整个路径
求直接获得上一层目录的名字的参数,或者处理路径字符串获得上一层目录名字的函数,谢谢了!

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

[ Last edited by willsort on 2006-6-26 at 14:04 ]
第2楼 3742668 发表于 2006-04-05 13:47
荣誉版主 发帖 718 积分 2,013

基本上能实现,不过细节方面自己修改。
第3楼 Climbing 发表于 2006-04-05 18:21
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
真的很高明!
第4楼 3742668 发表于 2006-04-05 21:09
荣誉版主 发帖 718 积分 2,013
过奖了,只是写了个大致,连最基本的过滤掉重新的项都没有,不过并不是什么问题,只要在倒数第二行前面加个findstr语句就行了;另外就是如果目录名中包含空格的话也会出错,如果用另外一种方法的话就可以避免这种情况,不过那样效率会低很多而且要复杂很多,至于防止出现这种错误,其实也不难,只要根据情况在把/替换为空格的时候改成替换引号加空格(" )就行了。
第5楼 doscc 发表于 2006-04-05 22:50
中级用户 发帖 93 积分 256 来自 广东


[ Last edited by doscc on 2006-4-5 at 22:51 ]
第6楼 3742668 发表于 2006-04-05 23:05
荣誉版主 发帖 718 积分 2,013
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
第7楼 willsort 发表于 2006-04-06 02:53
元老会员 发帖 1,512 积分 4,432
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进行逆序探测。实现如下:

第8楼 fry82lau 发表于 2006-04-06 14:02
新手上路 发帖 4 积分 12
学到很多东西啊!谢谢各位啦!
第9楼 fry82lau 发表于 2006-04-06 15:10
新手上路 发帖 4 积分 12
还有问题
我还是把我最终的目的说说吧。
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的存放的顺序,如何能够得到按照文件名排序的序列。

在此先谢过各位高手啦!!谢谢!!
第10楼 3742668 发表于 2006-04-06 18:48
荣誉版主 发帖 718 积分 2,013
知我者willsort也。

楼主你试试吧。
我真傻,真的,居然开始没有想到用%cd%;
我真傻,真的,居然认为开始的那种方法效率是最高的;


第11楼 willsort 发表于 2006-04-06 21:31
元老会员 发帖 1,512 积分 4,432
Re 3742668:

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

根据楼主 9 楼的描述,dir 需要加上 /on 的开关参数,而for需要加上 "delims=" 的选项参数;至于兄使用 echo %%jpg:%cd1%=%% | findstr . 来实现变量的嵌套到是我未曾发现的技巧,通常我会使用生成中间临时代码(DOS)或者启用变量延迟扩展(CMD)的方法。下面的代码算是对10楼程序的补充。



[ Last edited by willsort on 2006-4-6 at 21:39 ]
第12楼 fry82lau 发表于 2006-04-07 13:44
新手上路 发帖 4 积分 12
基本实现功能了,谢谢willsort和3742668
使用10楼的代码,再加上"delims=" 和 “/on ”参数,
即 for /f "delims=" %%i in ('"dir /a /s /b /on *.jpg"') do call :next "%%i"
就实现功能了,虽然速度好像慢了点。
至于11楼的代码也实现功能了,速度会相对快一点。

代码中还有一些不明白的地方,特别是那些参数,不知道大虾们有没有相关的资料介绍,参考书籍也可以。再次谢过!
第13楼 qdcr 发表于 2006-07-07 12:36
初级用户 发帖 32 积分 120
不知道对于已结的问题,还能不能回复:

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都支持,请问如何不使用延迟扩展而实现同样的功能?谢谢
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023