在批处理中,set的功能有点繁杂:设置变量、显示环境变量的名及值、做算术运算、等待用户的输入、字符串 截取 、替换字符串,是我们常用的命令之一。

  在字符串 截取 方面,新手因为没能注意到偏移量的问题,很容易提取到错误的字符串,因此,特开此帖,详细解释 set  截取 字符的用法。

  我们先来看一个例子:

  set str=123456789

  现在,我需要提取变量 str 中的第一个字符,那么,该怎么写命令呢?

  set var=%str:~1,1%?我想,这很可能是很多粗懂set用法的新手们的第一反应,实际上,这条语句提取到的是字符"2",并不是我们想要的"1",也就是说,set var=%str:~1,1% 提取到的是字符串第二位上的字符,而不是第一位上的,这是什么原因呢?

  原来,set 命令从左到右做字符 截取 的时候,是以整个字符串的第一个字符为起点来计算要 截取 字符的偏移量的,也就是说, 截取 字符的时候,set 会计算提取后字符串的第一个字符相对于整个字符串第一个字符偏移了多少字符的长度。 请注意,set 是按偏移量而不是字符的绝对位置来提取字符的 ,这一点非常重要。只要牢记这一点,大家在 截取 字符的时候,将会不再在这个问题上犯错。

  现在,我们可以把 截取 字符的命令用一条语句模式来表示,那就是:set var=%str:~偏移量,长度%。

  我们来详细解读这条语句模式的含义:

  首先,我们需要把要操作的字符串赋予一个变量,在这条语句中,是把字符串赋予了变量 str ;然后,我们需要确定一下我们想提取的字符串是哪一部分,比如说要提取字符串第2个字符及其之后的3个字符,或是提取字符串第5个字符及其之后的4个字符……,最后,计算偏移量及长度,比如要提取字符串第2个字符及其之后的3个字符,那么,也就是提取相对于第一个字符偏移量为1、提取后的字符串长度为4的字符串,写成语句就是:set var=%str:~1,4%。

  到目前为止,我们只谈到了很简单的 截取 操作,如果碰到比较复杂的提取需求,比如:提取第2个字符及其之后的所有字符、提取最后的3个字符、提取倒数第2个及其之前的3个字符、提取除了最后4个字符的字符串……那又该怎么办呢?别着急,set 命令在设计的时候就已经充分考虑到我们的复杂需求,只要对刚才我们提到的字符 截取 语句稍做改动,就可以很轻松地完成任务。

  我们知道,数字的正负可以用+-符号来表示,同样的,方向的正反也可以用+-来标注。在 set 做字符 截取 的时候,引入了+-符号来表示字符 截取 的方向:从左到右 截取 为+,从右到左 截取 为-,所以,set var=%str:~1,4% 也可以写成 set var=%str:~+1,+4% , 只是在从右到左截取的时候,情况发生了一点变化,那就是:偏移量的起点以整个字符串最后一个字符的后一位来计算。 现在,我们可以来回答上一段中提出的一些问题:

  提取最后的3个字符:set var=%str:~-3%
  提取倒数第2个及其之前的3个字符:set var=%str:~-5,4%
  提取除了最后4个字符的字符串:set var=%str:~0,-4%

  看了上面三种需求的代码,大家可能又会产生新的疑问:第一条怎么只有一个数字啊?第三条最后一个数字是负号,又表示什么意思呢?

  原来,在 set var=%str:~偏移量,长度% 这样的语句中,如果没有逗号及其之后的长度,就表示 截取 偏移量位置上及其之后的所有字符,如果长度的值为负数,则表示抛弃最后几个字符。

  现在,我们可以对任意位置上的字符做提取工作了(假设 set str=123456789):

  ① 提取1: set var=%str:~0,1% 或 set var=%str:~0,-8% 或 set var=%str:~-9,1%
  ② 提取2: set var=%str:~1,1% 或 set var=%str:~1,-7% 或 set var=%str:~-8,1%
  ③ 提取9: set var=%str:~8,1% 或 set var=%str:~8% 或 set var=%str:~-1,1% 或 set var=%str:~-1%
  ④ 提取123:set var=%str:~0,3% 或 set var=%str:~0,-6% 或 set var=%str:~-9,3%
  ⑤ 提取234:set var=%str:~1,3% 或 set var=%str:~1,-5% 或 set var=%str:~-8,3%
  ⑥ 提取789:set var=%str:~6,3% 或 set var=%str:~6% 或 set var=%str:~-3,3% 或 set var=%str:~-3%

  最后,我们来总结一下字符 截取 的规律:

  1、截取字符串可以用 set var=%str:~数值1,数值2% 这样的语句来实现;
  2、字符的截取是以偏移量来计算的,而不是以字符的绝对位置来计算;
  3、当数值1为正数时,表示从左到右截取;当数值1为负数时,表示从右到左截取
  4、当数值2为正数时,表示要截取后字符串的长度;当为负数时,表示要抛弃的最后几个字符长度;
  5、当数值2及其之前的逗号不存在时,表示截取的是第(数值1+1)个字符及其之后的所有字符;

批处理命令set截取字符详解相关推荐

  1. 批处理命令(copy)详解

    语法 copy[源盘符:][路径]<源文件名>[a|b][目标盘符:][路径]<目标文件>[a|b][/d][/v][/n][y|-y][/z][/?] copy<源文件 ...

  2. BAT批处理中的字符串处理详解(字符串截取)

    BAT批处理中的字符串处理详解(字符串截取 批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集.批处理中可实现的字符串处理功能有:截取字符串内容.替换字符串特定字段.合并字 ...

  3. BAT批处理中的字符串处理详解

    参考文章:BAT批处理中的字符串处理详解(字符串截取) 1.截取字符串 截取字符串可以说是字符串处理功能中最常用的一个子功能了,能够实现截取字符串中的特定位置的一个或多个字符.举例说明其基本功能: @ ...

  4. Shell test命令(Shell [])详解,附带所有选项及说明

    test 是 Shell 内置命令,用来检测某个条件是否成立.test 通常和 if 语句一起使用,并且大部分 if 语句都依赖 test. test 命令有很多选项,可以进行数值.字符串和文件三个方 ...

  5. linux mount命令参数及用法详解

    linux mount命令参数及用法详解 非原创,主要来自 http://www.360doc.com/content/13/0608/14/12600778_291501907.shtml. htt ...

  6. python u_对python 命令的-u参数详解

    缘起: 今天在看arcface的训练代码,在shell脚本中运行python 命令时后面加了-u 参数(python -u xx.py),于是对这个参数进行了下小研究. 准备知识 用网上的一个程序示例 ...

  7. Linux Bash命令关于程序调试详解

    转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...

  8. Windows命令:Net使用详解

      [转帖]Windows命令:Net使用详解 Windows命令:Net使用详解 Windows 中的网络命令行的参数实在是够多也够复杂,当然其功能也是十分的强大,在某些场合下(如入侵到了某服务器^ ...

  9. JVM调优系列--Java命令选项(参数)--大全/详解/常用

    原文网址:JVM调优系列--Java命令选项(参数)--大全/详解/常用_IT利刃出鞘的博客-CSDN博客 简介 说明        本文介绍Java的java命令用法,包括:常用用法.选项大全. J ...

最新文章

  1. java mysql insert_MySQL中INSERT的一般用法
  2. IT知识架构和操作系统简介1
  3. tomcat 、jsp、 servlet 、jstl版本对应
  4. 2.自定义变量调节器
  5. 气味识别应用_解决气味
  6. 前后端敏感数据加密方案及实现_02
  7. 作者:洪文兴(1980-),男,厦门大学自动化系副教授,厦门信息产业与信息化研究院执行院长。...
  8. 计算机应用基础1,计算机应用基础1
  9. 教你如何申请CCNP的电子证书
  10. java中断线程_Java线程中断机制-如何中断线程
  11. 大数据时代科研不能再两头花钱
  12. 原创 | 职场风云 (五)成长的烦恼
  13. CSDN获取C币方法
  14. php1怎么获取网卡id号,C#获得MAC地址(网卡序列号)代码
  15. 基于Word2vec文本聚类
  16. swift编程语言和c,Swift与Objective C对比:选择更快的开发语言
  17. Matlab心电信号QRS波检测
  18. linux php 验证码不显示_怎么解决php linux验证码不显示的问题
  19. JDBC-Web抽取公共的增删改方法
  20. 小记(1)偷影子的人

热门文章

  1. boost::intrusive::splay_set用法的测试程序
  2. boost::geometry::strategy::distance::pythagoras_point_box用法的测试程序
  3. Boost:在GPU上对int的std :: vector进行排序
  4. 基于Boost::beast模块的快速WebSocket服务器
  5. Boost:bind绑定作为一个组合的测试程序
  6. Boost:实现同步客户端
  7. ITK:将vtkImageData转换为itk :: Image
  8. DCMTK:DSRDocumentTree,DSRDocumentSubTree,DSRDocumentTreeNode和DSRContentItem类的测试程序
  9. VTK:可视化算法之OfficeTube
  10. VTK:可视化之NoShading