文章目录
前言`%~dp0`的含义扩展字符串从字符串中截取路径、文件名脚本传参for语法扩展总结前言
又是实际开发中的问题,想要截取一个文件路径中的盘符、文件名等信息,第一反应是正则表达式?或者是split
函数?这些往往都是“高级”语言中才会有的实现方法,对于批处理来说有点“带不动”啊,那么在bat批处理中要怎样处理类似的请求呢?最近找到了两种方法,接下来会逐一展示一下,不过在展示具体的写法前,我们先来看一下%~dp0
的含义。
%~dp0
的含义
关于%~dp0
的作用在之前的总结中 《.bat批处理(四):路径相关%cd%和%~dp0的区别》 有提到过,它表示当前运行的批处理文件所在的目录,那么它是一个特殊的变量吗?
可以说算是吧,这个变量特殊在它是从参数变量%0
扩展而来的,提到%0
很多人都会想到它是批处理脚本的第一个参数,表示当前运行的脚本全路径,可以写个脚本试一下:
# Albert at home-pc in D:\data\bat [0:03:25]% Get-Content showparams.bat@echo offecho %0echo %1# Albert at home-pc in D:\data\bat [0:03:31]% ./showparams.bat good"D:\data\bat\showparams.bat"good
类似的变量还有1%
、2%
、3%
… 一直到9%
,都依次表示运行批处理脚本时传入的参数,这些变量还有一个本领,那就是支持扩展,写起来花里胡哨的。
扩展字符串
扩展字符串是批处理自带的功能,可以实现对表示文件路径的字符串进行特殊的处理,以%0
参数为例,具体功能列举如下:
%~0
- 删除路径中的引号%~f0
- 将 %0 扩展到一个完全合格的路径名%~d0
- 将 %0 扩展到一个驱动器号%~p0
- 将 %0 扩展到一个路径%~n0
- 将 %0 扩展到一个文件名%~x0
- 将 %0 扩展到一个文件扩展名%~s0
- 将 %0 扩展的路径只含有短名%~a0
- 将 %0 扩展到文件的文件属性%~t0
- 将 %0 扩展到文件的日期/时间%~z0
- 将 %0 扩展到文件的大小%~$PATH:0
查找变量0%
在环境变量$PATH
的目录,并将%0
扩展到找到的第一个完全合格的名称,$PATH
未被定义或没找到文件,则结果为空字符串
当然这个写法也可以进行组合,比如%~d0
和%~p0
组合后变成%~dp0
也就是我们常见的那个变量啦~
可以将这些变量打印出来看一下具体的值:
# Albert at home-pc in D:\data\bat [0:26:17]% Get-Content showparams.bat@echo offecho %0echo %~0echo %~f0echo %~d0echo %~p0echo %~n0echo %~x0echo %~s0echo %~a0echo %~t0echo %~z0echo %~dp0echo %~nx0# Albert at home-pc in D:\data\bat [0:26:28]% .\showparams.bat"D:\data\bat\showparams.bat"D:\data\bat\showparams.batD:\data\bat\showparams.batD:\data\bat\showparams.batD:\data\bat\showparams.bat--a--------/10/17 00:26156D:\data\bat\showparams.bat
从字符串中截取路径、文件名
上面的部分解释了%~dp0
,同时也知道了这些脚本参数指出扩展语法,如果是普通变量的话就不能使用扩展语法了,那么对于一个普通的包含字符串怎么才能使用扩展语法,截取到想要的部分呢?目前我知道的有两种方法:一种是传参使其变成脚本参数,也就是%n
的形式,另一种方法就是使用for
语句,接下来分别看一下。
脚本传参
普通的字符串无法进行扩展,如果想把这种变量就需要把它们变成脚本参数,这就需要将参数传递给另一个脚本,这样实现起来会将脚本调用变得复杂一些,实际上可以在一个脚本中完成截取工作,类似于C/C++中的函数调用,可以在批处理中使用call
命令搭配标签实现,具体代码如下:
# Albert at home-pc in D:\data\bat [17:37:54]% Get-Content extract1.bat@echo offset OriginStr="C:/Demo/myproject/example.txt"echo %OriginStr%call :extract %OriginStr%goto :eof:extractrem 获取到文件路径echo %~dp1rem 获取到文件盘符echo %~d1rem 获取到文件名称echo %~n1rem 获取到文件后缀echo %~x1# Albert at home-pc in D:\data\bat [17:41:25]% .\extract1.bat"C:/Demo/myproject/example.txt"C:\Demo\myproject\C:example.txt
在这段代码中:eof
标签是一个默认的标签,表示文件结尾,实际需求中需根据具体要求进行调整。
for语法扩展
使用 for 循环是另一种实现方式,因为循环变量也可以支持扩展,可以将需要截取的字符串路径放在循环范围中,然后先循环输出测试下:
# Albert at home-pc in D:\data\bat [17:46:29]% Get-Content extract2.bat@echo offset OriginStr="C:/Demo/myproject/example.txt"for %%I in (%OriginStr%) do echo %%I# Albert at home-pc in D:\data\bat [17:46:57]% .\extract2.bat"C:/Demo/myproject/example.txt"
在批处理中的循环变量是%%I
的形式,需要两个 % 才可以,后面的变量名可以换成26个字母中的任意一个,并且字母会区分大小写,然后利用这些循环变量就可以进行扩展,然后完成最开始的需求,实现代码如下:
# Albert at home-pc in D:\data\bat [17:53:53]% Get-Content extract2.bat@echo offset OriginStr="C:/Demo/myproject/example.txt"for %%I in (%OriginStr%) do echo %%Irem 获取到文件路径for %%I in (%OriginStr%) do echo %%~dpIrem 获取到文件盘符for %%I in (%OriginStr%) do echo %%~dIrem 获取到文件名称for %%I in (%OriginStr%) do echo %%~nIrem 获取到文件后缀for %%I in (%OriginStr%) do echo %%~xI# Albert at home-pc in D:\data\bat [17:54:01]% .\extract2.bat"C:/Demo/myproject/example.txt"C:\Demo\myproject\C:example.txt
这种写法的好处就是无需控制标签跳转流程,通过循环命令 for 就可以获取想要的参数,使用起来会方便很多。
总结
在批处理文件中%~dp0
表示批处理文件所在的目录,而%cd%
表示执行命令时所在的目录在批处理文件中想要截取目录操作可以使用变量扩展来实现,而变量必须是%i
的形式,其中的i
是可以是a~zA~Z0~9
for 表达式中的循环变量在cmd命令行中是%i
的形式,而在批处理文件中需要协程%%i
的形式常用的变量扩展有:获取到文件盘符使用%~d0
,获取到文件名称使用%~n0
,获取到文件后缀使用%~x0
==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==反人性需要不断修炼,逆向思维才能战胜人性的弱点,很多时候事情往往不是你想的那样~