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