[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [分享]批处理文件路径解析

看了一些前人总结的解析诸如“c:\abc\def\ghi\jkl\mno\pqr.stu”这样的文件路径的代码,但是总有些不太满意,有些不能逐层往下解析,而逐层往下解析的往往又一个字符一个字符的解析,比较影响效率,后来在看用for解析字符串时得到一些启发。以下代码稍加改动就可以从正向或者反向解析任意层数的路径
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set var=c:\abc\def\ghi\jkl\mno\pqr.stu
  4. echo 全路径是%var%
  5. :re
  6. :: 以“\”分割字符串%var%
  7. for /f "tokens=1,2* delims=\" %%i in ("%var%") do (
  8.     :: 现在分割到的路径是nowpath;为了避免前面错误的出现“\”,设置了初始判断
  9.     if "!nowpath!"=="" (set nowpath=%%i) else set nowpath=!nowpath!\%%i
  10.     echo 现在得到的路径是!nowpath!
  11.     :: 把拆解得到的剩余变量再设回去(来重新循环拆解)
  12.     set var=%%j\%%k
  13.     :: 判断文件所在目录(就是倒数第一层目录,或者若全路径是文件夹的情况则是倒数第二层目录)
  14.     if "%%k"=="" (if "!nowpath1!"=="" set nowpath1=!nowpath!)
  15.     :: 判断文件名(若全路径是文件夹的情况则是倒数第一层目录);如果没拆完就继续
  16.     if "%%j"=="" (set filename=%%i) else goto re
  17. )
  18. echo 文件所在的文件夹路径是%nowpath1%
  19. echo 文件名称是%filename%
  20. pause
复制代码
执行结果是
  1. 全路径是c:\abc\def\ghi\jkl\mno\pqr.stu
  2. 现在得到的路径是c:
  3. 现在得到的路径是c:\abc
  4. 现在得到的路径是c:\abc\def
  5. 现在得到的路径是c:\abc\def\ghi
  6. 现在得到的路径是c:\abc\def\ghi\jkl
  7. 现在得到的路径是c:\abc\def\ghi\jkl\mno
  8. 现在得到的路径是c:\abc\def\ghi\jkl\mno\pqr.stu
  9. 文件所在的文件夹路径是c:\abc\def\ghi\jkl\mno
  10. 文件名称是pqr.stu
复制代码
用这个方法同样可以用for解析一个超过32个解析单位的字符。(因为看到教程中似乎有讨论到解析这样一组数,但是没提到这种方法(抑或我没找到?……那就当重提一下吧~))
示例中字符串要以空格解析从1到33这样一堆东西,若用%a %b %c......直接是无法全部token的。用这个方法我们可以把处理过程中产生的一组数寄存或追加到变量中,然后用的时候再解析出来。
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set var=1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
  4. :re
  5. for /f "tokens=1*" %%i in ("%var%") do (
  6. echo %%i
  7. set var=%%j
  8. if not "!var!"=="" goto re
  9. )
  10. pause
复制代码

  1. @echo off
  2. set var="c:\abc\def\ghi\jkl\mno\pqr.stu"
  3. Call :OutDeep %var%
  4. pause
  5. :OutDeep
  6. echo 全路径:%1
  7. Call :InnerDeep "%~1"
  8. echo 所在路径:%~dp1
  9. echo 文件名:%~nx1
  10. goto :EndDeep
  11. :InnerDeep
  12. if /i "%~1\"=="%~dp1" goto :EndDeep
  13. set c=%~dp1
  14. if %c:~-1,1%==\ set c=%c:~0,-1%
  15. Call :InnerDeep %c%
  16. echo 现在得到的路径是:%~1
  17. ::echo 现在得到的路径是:%~n1
  18. :EndDeep
复制代码

TOP

回复 2楼 的帖子

呵呵,谢谢你提供的代码!
以前也见过类似的代码,主要问题就是出在“if %c:~-1,1%==\ set c=%c:~0,-1%”这一行上,相当于一个字符一个字符地解析,这样的话执行效率比较受影响,尤其是解析到类似于回收站里的文件夹那样的路径,超长无比,一个一个拆比较慢~

TOP

。。。

这个是一个个解析?

这个只是判断最后一个字符是不是\是的话就去掉。
因为
c:\test\test 通过%dp扩展得到的是C:\test\
c:\test\test\ 通过 %dp扩展得到的还是 c:\test\test\

我只是去掉最后一个"\",不是一个字符比较"\"

TOP

回复 4楼 的帖子

哦呵呵,刚开始没看太明白~用%dp扩展的方式还是很不错的~

TOP

返回列表