Board logo

标题: [请教]如何获取绝对路径中文件名的最后一部分?[已解决] [打印本页]

作者: yardian     时间: 2006-10-19 01:38    标题: [请教]如何获取绝对路径中文件名的最后一部分?[已解决]

不会编程,对dos的批处理也不是很熟.想写个脚本真难.又遇到一个新问题:
我现在想获取包含绝对路径的文件名的最后一部分,请问批处理如何写?
比如:a:\c\E\b.txt(路径长度不固定,可能有很多层目录),现在我想建一个变量,让这个变量的值为b.txt,请问如何用批处理解决?

[ Last edited by yardian on 2006-10-19 at 11:24 ]
作者: 3742668     时间: 2006-10-19 01:49

@echo off
    set file=c:\abc\efg\xxx.xxx
    call :Print "%file%"
pause
goto :eof

:Print
    echo %~nx1
goto :eof
代码直接在回贴里面写的,未测试...
作者: yardian     时间: 2006-10-19 02:10
谢谢!要的就是这种效果!
作者: namejm     时间: 2006-10-19 06:01
  3742668的代码可以简化一下:
@echo off
set file=c:\abc\efg\xxx.xxx
for /f "delimes=" %%i in ("%file%") do echo %%~nxi
pause
  发现了一个小bug,修正了一下,可以适应路径名为空格的情形。

[ Last edited by namejm on 2006-10-19 at 06:24 ]
作者: lanlaila     时间: 2006-10-19 06:04
这里学习气氛真好,我要好好学习了
作者: pengfei     时间: 2006-10-19 06:10
真不错!

3742668版主是把文件路径用call转化成%1的变量, 为扩充到文件名和后缀名做准备.

而namejm版主直接使用for将文件路径转化成可替换变量, 再执行扩充.
作者: 3742668     时间: 2006-10-19 07:46

@echo off
    set file=x:\xxx\xxx\xxx.xxx
    set file=%file:\=\\%
    wmic datafile where "caption='%file%'" get filename,extension
pause

@echo off
    set file=x:\xxx\xxx\xxx.xxx
    set str=%file%
:loop
    set str=%str:*\=%
    echo %str% | findstr /i "\\" >nul && goto loop
    echo %file% ---^> %str%
pause
以上代码均未测试...
作者: yardian     时间: 2006-10-19 07:47
大家都厉害,还是这里气氛好啊,多谢各位了
作者: namejm     时间: 2006-10-19 08:02
  7F的第二段代码可能是最通用的。把它扩展一下,就可以获取指定层次的文件夹名了。
作者: 3742668     时间: 2006-10-19 08:10

@echo off
    set file=x:\xxx\xxx\xxx.xxx
    set file=%file:\=" "%
    call :Get "%file%"
pause
goto :eof

:Get
    for %%i in (%*) do echo %%~i
goto :eof
通用还是要用上面的.
作者: namejm     时间: 2006-10-19 08:40
  10F的不能正确处理带空格的路径,而7F的可以处理;如果要获取指定层次的文件夹名的话,10F的更简洁一点,而7F的也可以实现,只是代码会长一点。如果从通用性上考虑的话,我还是觉得7F的才是真正的通用。

————————————————————————————————————
  经过再次测试证明,以上蓝色内容中关于10F的代码不能处理空格的言论严重失实,看来10F的才是真正的通用的。

  附上我的测试代码(意图:获取路径中第二层文件夹名;结果:不能正确获取指定层次的文件夹名):
@echo off
    set file=c:\ab c\def\gh .exe
    set file=%file:\=" "%
    call :Get "%file%"
pause
goto :eof

:Get
    for /f "tokens=2" %%i in (%*) do echo %%~i
goto :eof
[ Last edited by namejm on 2006-10-21 at 06:13 ]
作者: 3742668     时间: 2006-10-20 08:15
Try...
作者: namejm     时间: 2006-10-21 01:30
  呵呵,测试过了,确实能处理带空格的路径,但是不能正确获取空格路径中指定层次的文件夹名。
作者: 3742668     时间: 2006-10-21 01:42
NO What Is Cann't...(Chinese English)
@echo off
    set file=c:\ab c\def\gh .exe
    set file=%file:\=" "%
    call :Get 4 "%file%"
pause
goto :eof

:Get
    for /l %%i in (1,1,%1) do shift
    echo %~1
goto :eof

作者: lxmxn     时间: 2006-10-21 02:14
  呵呵,版主表演得精彩……
  
  学习了。。。

作者: lxmxn     时间: 2006-10-21 02:54

  namajm兄在F11中的代码是测试错误的代码还是正确的代码?
 
  我这里测试,没有通过,显示的是"ab",而不是我们想得到的"ab c",不知道咋回事。。

作者: namejm     时间: 2006-10-21 06:15
  不好意思,我举的例子是想说明那段代码不能正确获取带空格路径中指定层次的文件夹名,当时没有注释清楚,现在已经注释好了。
作者: namejm     时间: 2006-10-21 06:17
  14F的代码确实厉害,用到了比较生僻的shift,颇具技巧性,它可能是最具备通用性的了。
作者: lxmxn     时间: 2006-10-21 07:03

  呵呵。。。

  我一直在思考这个问题:

  为什么在11楼的代码不行,而在14楼的代码却可行呢?难道就是这个shift起的作用?也没有明白为什么要循环4次。

作者: 3742668     时间: 2006-10-21 07:35
多看看 <帮助与支持>吧.
不一样的搭配就有不一样的味,这也是脚本存在的原因之一:
@echo off
setlocal ENABLEDELAYEDEXPANSION
    set str=c:\ab c\def\gh .exe\
    set num=1
    for /l %%i in (1,1,%num%) do set "str=!str:*\=!"
    echo %str:\= && 2>nul cd %
pause
把最后的cd换成echo就可以逐级显示.
几种方法使用的场合不同,至于孰好孰坏,那就是见仁见智了.
作者: namejm     时间: 2006-10-21 08:39
  发现 echo %str:\= && 2>nul cd % 一句中,把cd换成任意的命令都能正确执行,对这一句去掉最后几个\分隔的内容的写法百思不得其解,还请3742668解说一二。

  另外,echo %str:\= && 2>nul cd %在提取其中的文件夹名的时候,最后一位是空格,在提取文件名的时候没有这个问题,换成 echo %str:\=&& 2>nul cd % 就可以了(注意:两条语句&&前一个有空格,一个没有空格)。
作者: pengfei     时间: 2006-10-21 08:43


  Quote:
Originally posted by 3742668 at 2006-10-21 07:35:
多看看 <帮助与支持>吧.
不一样的搭配就有不一样的味,这也是脚本存在的原因之一:
几种方法使用的场合不同,至于孰好孰坏,那就是见仁见智了.

同意, 解决问题的方法多种多样, 就看你怎么用了.
作者: 3742668     时间: 2006-10-21 09:00


  Quote:
Originally posted by namejm at 2006-10-21 08:39:
  发现 echo %str:\= && 2>nul cd % 一句中,把cd换成任意的命令都能正确执行,对这一句去掉最后几个\分隔的内容的写法百思不得其解,还请37426 ...

记得在那篇讨论加密解密的贴子里就有使用到过类似的方法.
原理很简单,例如:
set "command=set i=3"
echo i的值:%i% & pause
%command%
echo i的值:%i% & pause
参考:[原创][讨论]非编译型批处理加密方案与代码之11F方案。
另外其实最后一种方法还存在一点小问题,获得最后的文件名时可能显示出一行"ECHO 处于打开状态"之类的提示,为了节省代码量,没对它进行处理.
作者: uemuem     时间: 2006-10-24 03:32


  Quote:
Originally posted by 3742668 at 2006-10-21 09:00:

记得在那篇讨论加密解密的贴子里就有使用到过类似的方法.
原理很简单,例如:
[code]
set "command=set i=3"
echo i的值:%i% & pause
%command%
ech ...

经测试,确实会出现:“ECHO处于打开/关闭状态的提示”,不知道怎么样解决这个问题,经常会碰到这个问题。。。
作者: namejm     时间: 2006-10-24 06:39
  请问是在什么情况下出现“ECHO处于打开/关闭状态“的提示的?请把测试的路径发出来看一下。估计把 echo %str:\= && 2>nul cd % 修改成  echo. %str:\=&& 2>nul cd % 就可以了(注意:echo后有一个点号)。
作者: cl87388881     时间: 2006-10-24 21:58
好,强!值得学习~!