当前位置: 首页 > news >正文

.bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息

文章目录

  • 前言
  • `%~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 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

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

反人性需要不断修炼,逆向思维才能战胜人性的弱点,很多时候事情往往不是你想的那样~

相关文章:

  • linux环境下从路径字符串中截取目录和文件名信息
  • MD5是用来加密的吗?BCrypt又是什么呢
  • 树的带权路径长度和哈夫曼树
  • 完全图与强连通图的那些坑
  • linux环境下恢复rm误删的文件
  • 记一次使用Valgrind查找解决内存问题的玄幻旅程
  • 网络工具nc的常见功能和用法
  • git常用配置——git show/diff tab 显示宽度
  • Windows设置防火墙允许指定应用正常使用网络
  • 2021年终总结——脚踏实地,为下一次腾飞积蓄力量
  • 通过WindowsStore安装QuickLook小工具方便文件预览
  • linux环境下随时照看服务器进程的ps和top命令
  • 简单梳理下git的使用感受,思考git中最重要的是什么
  • 总结下各种常见树形结构的定义及特点(二叉树、AVL树、红黑树、Trie树、B树、B+树)
  • epoll的LT模式(水平触发)和ET模式(边沿触发)
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 30秒的PHP代码片段(1)数组 - Array
  • conda常用的命令
  • crontab执行失败的多种原因
  • E-HPC支持多队列管理和自动伸缩
  • Flex布局到底解决了什么问题
  • Java的Interrupt与线程中断
  • Js基础——数据类型之Null和Undefined
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • PAT A1092
  • 编写符合Python风格的对象
  • 分布式事物理论与实践
  • 将 Measurements 和 Units 应用到物理学
  • 类orAPI - 收藏集 - 掘金
  • 聊一聊前端的监控
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 函数计算新功能-----支持C#函数
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $.ajax,axios,fetch三种ajax请求的区别
  • (AngularJS)Angular 控制器之间通信初探
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (简单) HDU 2612 Find a way,BFS。
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)ObjectiveC 深浅拷贝学习
  • (转)VC++中ondraw在什么时候调用的
  • (转载)Google Chrome调试JS
  • ***利用Ms05002溢出找“肉鸡
  • ***通过什么方式***网吧
  • .htaccess配置常用技巧
  • .NET 8.0 中有哪些新的变化?
  • .net wcf memory gates checking failed
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET6 命令行启动及发布单个Exe文件
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • @Validated和@Valid校验参数区别
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?