在bat中从路径字符串中截取盘符、文件名、后缀名等信息
前言
又是实际开发中的问题,想要截取一个文件路径中的盘符、文件名等信息,第一反应是正则表达式?或者是 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 off
echo %0
echo %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 off
echo %0
echo %~0
echo %~f0
echo %~d0
echo %~p0
echo %~n0
echo %~x0
echo %~s0
echo %~a0
echo %~t0
echo %~z0
echo %~dp0
echo %~nx0
# Albert at home-pc in D:\data\bat [0:26:28]
% .\showparams.bat
"D:\data\bat\showparams.bat"
D:\data\bat\showparams.bat
D:\data\bat\showparams.bat
D:
\data\bat\
showparams
.bat
D:\data\bat\showparams.bat
--a--------
2021/10/17 00:26
156
D:\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 off
set OriginStr="C:/Demo/myproject/example.txt"
echo %OriginStr%
call :extract %OriginStr%
goto :eof
:extract
rem 获取到文件路径
echo %~dp1
rem 获取到文件盘符
echo %~d1
rem 获取到文件名称
echo %~n1
rem 获取到文件后缀
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 off
set 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 off
set OriginStr="C:/Demo/myproject/example.txt"
for %%I in (%OriginStr%) do echo %%I
rem 获取到文件路径
for %%I in (%OriginStr%) do echo %%~dpI
rem 获取到文件盘符
for %%I in (%OriginStr%) do echo %%~dI
rem 获取到文件名称
for %%I in (%OriginStr%) do echo %%~nI
rem 获取到文件后缀
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
【出处】:https://blog.csdn.net/shihengzhen101/article/details/120818017
=======================================================================================
bat路径解析
在Windows操作系统中,BAT文件(批处理文件)是一种文本文件,它包含了一系列可以在命令行界面(CMD)中执行的命令。路径解析在BAT文件中通常涉及对文件、目录和可执行文件的定位。下面是一些关于BAT文件中路径解析的基本知识和技巧:
1. 绝对路径和相对路径
- 绝对路径:从根目录开始的完整文件路径。例如:C:\Users\Username\Documents\file.txt
- 相对路径:相对于当前工作目录的路径。例如:..\Documents\file.txt 表示当前目录的上一级目录中的Documents文件夹。
2. 环境变量
Windows提供了许多环境变量,这些变量可以用来简化路径的引用。例如:
- %SystemRoot% 代表Windows的安装目录,通常是 C:\Windows
- %USERPROFILE% 代表当前用户的配置文件目录,通常是 C:\Users\Username
在BAT文件中,你可以这样使用这些变量:
echo %SystemRoot% echo %USERPROFILE%3. 使用~符号解析路径
在BAT文件中,~符号可以用来解析路径中的特定部分,例如:
- %~dp0:展开为批处理文件所在的完整目录路径,不包含文件名。
- %~nx0:展开为批处理文件的文件名和扩展名。
- %~f0:展开为批处理文件的完整路径,包括文件名和扩展名。
示例:
@echo off echo Current batch file directory: %~dp0 echo Current batch file name: %~nx0 echo Full path of current batch file: %~f04. 路径中的特殊字符
路径中可能包含空格、特殊字符等,为了正确解析这些路径,可以使用引号将路径括起来。例如:
cd "C:\Program Files\Application"5. 拼接路径
在BAT文件中,你可以使用变量和字符串拼接来构造路径。例如:
set "baseDir=C:\Data"6. 检查路径是否存在
你可以使用if exist语句来检查一个路径是否存在。例如:
if exist "C:\Data\report.txt" (echo File exists.) else (echo File does not exist. )7. 遍历目录
使用for循环可以遍历目录中的文件或子目录。例如,遍历当前目录下的所有.txt文件:
for %%f in (*.txt) do ( echo %%f )总结
BAT文件中的路径解析涉及对绝对路径、相对路径、环境变量、特殊符号、路径拼接、路径存在性检查和目录遍历的理解。掌握这些技巧可以帮助你更有效地编写和管理批处理脚本。
出处:https://cp.baidu.com/landing/tscp_doc/0c6357a2bf7df1b94cfcfd5707acd5eb
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【关注我】。(●'◡'●)
因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/17659369.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
浙公网安备 33010602011771号