中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 20:56
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何获得文件的上一层目录名字
楼 主 [已结]如何获得文件的上一层目录名字 发表于 2006-04-05 12:01 ·  中国 广东 珠海 电信
新手上路
积分 12
发帖 4
注册 2006-04-05 11:54
UID 53360
状态 离线
需要打印jpg文件上一层目录的名字
用参数%%~pc只获得整个路径
求直接获得上一层目录的名字的参数,或者处理路径字符串获得上一层目录名字的函数,谢谢了!

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

[ Last edited by willsort on 2006-6-26 at 14:04 ]
2 发表于 2006-04-05 13:47 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线

@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

基本上能实现,不过细节方面自己修改。
3 发表于 2006-04-05 18:21 ·  中国 河北 石家庄 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
UID 1565
性别 男
来自 河北保定
状态 离线
真的很高明!
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
4 发表于 2006-04-05 21:09 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
过奖了,只是写了个大致,连最基本的过滤掉重新的项都没有,不过并不是什么问题,只要在倒数第二行前面加个findstr语句就行了;另外就是如果目录名中包含空格的话也会出错,如果用另外一种方法的话就可以避免这种情况,不过那样效率会低很多而且要复杂很多,至于防止出现这种错误,其实也不难,只要根据情况在把/替换为空格的时候改成替换引号加空格(" )就行了。
5 发表于 2006-04-05 22:50 ·  中国 北京 宽捷网通信技术有限公司
中级用户
★★
积分 256
发帖 93
注册 2006-03-26 22:12
UID 52853
性别 男
来自 广东
状态 离线

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

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

谢谢!



[ Last edited by doscc on 2006-4-5 at 22:51 ]
6 发表于 2006-04-05 23:05 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
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 发表于 2006-04-06 02:53 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
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:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
8 发表于 2006-04-06 14:02 ·  中国 广东 珠海 电信
新手上路
积分 12
发帖 4
注册 2006-04-05 11:54
UID 53360
状态 离线
学到很多东西啊!谢谢各位啦!
9 还有问题 发表于 2006-04-06 15:10 ·  中国 广东 珠海 电信
新手上路
积分 12
发帖 4
注册 2006-04-05 11:54
UID 53360
状态 离线
我还是把我最终的目的说说吧。
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 发表于 2006-04-06 18:48 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
知我者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%;
我真傻,真的,居然认为开始的那种方法效率是最高的;


11 发表于 2006-04-06 21:31 ·  中国 山西 临汾 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
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:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
12 基本实现功能了,谢谢willsort和3742668 发表于 2006-04-07 13:44 ·  中国 广东 珠海 电信
新手上路
积分 12
发帖 4
注册 2006-04-05 11:54
UID 53360
状态 离线
使用10楼的代码,再加上"delims=" 和 “/on ”参数,
即 for /f "delims=" %%i in ('"dir /a /s /b /on *.jpg"') do call :next "%%i"
就实现功能了,虽然速度好像慢了点。
至于11楼的代码也实现功能了,速度会相对快一点。

代码中还有一些不明白的地方,特别是那些参数,不知道大虾们有没有相关的资料介绍,参考书籍也可以。再次谢过!
13 发表于 2006-07-07 12:36 ·  中国 北京 联通
初级用户
积分 120
发帖 32
注册 2006-06-19 16:31
UID 57256
状态 离线
不知道对于已结的问题,还能不能回复:

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都支持,请问如何不使用延迟扩展而实现同样的功能?谢谢
论坛跳转: