Board logo

标题: [已结]如何获得文件的上一层目录名字 [打印本页]

作者: fry82lau     时间: 2006-4-5 12:01    标题: [已结]如何获得文件的上一层目录名字

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

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

[ Last edited by willsort on 2006-6-26 at 14:04 ]
作者: 3742668     时间: 2006-4-5 13:47

@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
基本上能实现,不过细节方面自己修改。
作者: Climbing     时间: 2006-4-5 18:21
真的很高明!
作者: 3742668     时间: 2006-4-5 21:09
过奖了,只是写了个大致,连最基本的过滤掉重新的项都没有,不过并不是什么问题,只要在倒数第二行前面加个findstr语句就行了;另外就是如果目录名中包含空格的话也会出错,如果用另外一种方法的话就可以避免这种情况,不过那样效率会低很多而且要复杂很多,至于防止出现这种错误,其实也不难,只要根据情况在把/替换为空格的时候改成替换引号加空格(" )就行了。
作者: doscc     时间: 2006-4-5 22:50

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

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

谢谢!
[ Last edited by doscc on 2006-4-5 at 22:51 ]
作者: 3742668     时间: 2006-4-5 23:05
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
作者: willsort     时间: 2006-4-6 02:53
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=

作者: fry82lau     时间: 2006-4-6 14:02
学到很多东西啊!谢谢各位啦!
作者: fry82lau     时间: 2006-4-6 15:10    标题: 还有问题

我还是把我最终的目的说说吧。
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的存放的顺序,如何能够得到按照文件名排序的序列。

在此先谢过各位高手啦!!谢谢!!
作者: 3742668     时间: 2006-4-6 18:48
知我者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%;
我真傻,真的,居然认为开始的那种方法效率是最高的;



作者: willsort     时间: 2006-4-6 21:31
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 ]
作者: fry82lau     时间: 2006-4-7 13:44    标题: 基本实现功能了,谢谢willsort和3742668

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

代码中还有一些不明白的地方,特别是那些参数,不知道大虾们有没有相关的资料介绍,参考书籍也可以。再次谢过!
作者: qdcr     时间: 2006-7-7 12:36
不知道对于已结的问题,还能不能回复:

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