中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 18:55
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [请教]如何获取绝对路径中文件名的最后一部分?[已解决]
楼 主 [请教]如何获取绝对路径中文件名的最后一部分?[已解决] 发表于 2006-10-19 01:38 ·  中国 浙江 杭州 电信
中级用户
★★
积分 305
发帖 85
注册 2005-05-23 00:00
UID 39004
性别 男
状态 离线
不会编程,对dos的批处理也不是很熟.想写个脚本真难.又遇到一个新问题:
我现在想获取包含绝对路径的文件名的最后一部分,请问批处理如何写?
比如:a:\c\E\b.txt(路径长度不固定,可能有很多层目录),现在我想建一个变量,让这个变量的值为b.txt,请问如何用批处理解决?

[ Last edited by yardian on 2006-10-19 at 11:24 ]
2 发表于 2006-10-19 01:49 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线

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

:Print
echo %~nx1
goto :eof

代码直接在回贴里面写的,未测试...
3 发表于 2006-10-19 02:10 ·  中国 浙江 杭州 电信
中级用户
★★
积分 305
发帖 85
注册 2005-05-23 00:00
UID 39004
性别 男
状态 离线
谢谢!要的就是这种效果!
4 发表于 2006-10-19 06:01 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  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 ]
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
5 发表于 2006-10-19 06:04 ·  中国 湖北 仙桃 电信
新手上路
积分 6
发帖 3
注册 2006-10-18 09:22
UID 66291
状态 离线
这里学习气氛真好,我要好好学习了
6 发表于 2006-10-19 06:10 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
UID 58987
来自 湖南.娄底
状态 离线
真不错!

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

而namejm版主直接使用for将文件路径转化成可替换变量, 再执行扩充.
7 发表于 2006-10-19 07:46 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线

@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

以上代码均未测试...
8 发表于 2006-10-19 07:47 ·  中国 浙江 杭州 电信
中级用户
★★
积分 305
发帖 85
注册 2005-05-23 00:00
UID 39004
性别 男
状态 离线
大家都厉害,还是这里气氛好啊,多谢各位了
9 发表于 2006-10-19 08:02 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  7F的第二段代码可能是最通用的。把它扩展一下,就可以获取指定层次的文件夹名了。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
10 发表于 2006-10-19 08:10 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线

@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

通用还是要用上面的.
11 发表于 2006-10-19 08:40 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  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 ]
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
12 发表于 2006-10-20 08:15 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
Try...
13 发表于 2006-10-21 01:30 ·  中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
UID 51697
来自 成都
状态 离线
  呵呵,测试过了,确实能处理带空格的路径,但是不能正确获取空格路径中指定层次的文件夹名。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
14 发表于 2006-10-21 01:42 ·  中国 湖北 荆门沙洋区 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
UID 50550
状态 离线
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
15 发表于 2006-10-21 02:14 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线
  呵呵,版主表演得精彩……
  
  学习了。。。
论坛跳转: