set截取字符具体解释

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

  在字符串截取方面,新手由于没能注意到偏移量的问题,非常easy提取到错误的字符串,因此,特开此帖,详解 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%。

  到眼下为止,我们仅仅谈到了非常easy的截取操作,假设碰到比較复杂的提取需求,比方:提取第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:~-6,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,-8% 或 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,-6% 或 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)个字符及其之后的全部字符;



大家把下这个批处理重复练习,一定会有收获:

样例:截取字符练习工具

@echo off&color a&mode con cols=90 lines=12
title 截取字符练习工具 by bat-zw19750516
set var=1234567890一二三四五六七八九零
cls&echo.&echo 原始图案为:%var%
echo.&echo 注意前面有10个阿拉伯数字后面有10个语文数字,等下截取后记得看下。
echo.&echo 命令形式为:%%var:~m,n%%,当中的m为第一个參数可负可正可为零,n为第二个參数可负可正不为零。
echo.&echo 为了方便反复练习没有设置退出,要退出请直接关闭窗体。
echo.&echo 请按随意键開始练习。&pause>nul
:begin
set a=&set b=&set "c="
cls&echo.&set /p a= 请输入第一个參数(应为小于20的整数):
echo %a:-=%|findstr "[^0-9]"&&goto wrong
if "%a%" equ "" goto wrong
if %a% geq 20 goto wrong
cls&echo.&set /p b= 请输入第二个參数(应为大于-20并不为零的整数):
echo %b:-=%|findstr "[^0-9]"&&goto wrong
if "%b%" equ "" goto wrong
if %b% equ 0 goto wrong
if %b% lss -20 goto wrong
set /a c=20-a b
if %a% lss 0 if %b% lss 0 if %a% geq %b% goto wrong
if %a% gtr 0 if %b% lss 0 if %c% leq 0 goto wrong
cls&echo.&echo 原始图案为: %var%
echo.&echo 你输入的截取命令是: %%var:~%a%,%b%%%
echo.&call,echo 截取到的图案是 :%%var:~%a%,%b%%%
echo.&echo 请按随意键再次练习。&pause>nul&goto begin
:wrong
cls&echo.&echo 输入不合要求,请正确输入。&ping /n 2 127.1 >nul&goto begin

批处理中set截取字符具体解释的更多相关文章

  1. 批处理中setlocal enabledelayedexpansion的含义

    setlocal enabledelayedexpansion       延迟变量全称"延迟环境变量扩展",要理解这个东西,我们还得先理解一下什么叫扩展!       CMD在解 ...

  2. 批处理中for循环多个%

    实例:@echo offset NUM=10000for /f %%i in (字符.txt) do (set JSZF=%%ifor /L %%. in (0,1,%NUM%) do ( Call ...

  3. cmd批处理中set /a和set /p的区别介绍

    在 SET 命令中添加了两个新命令行开关: SET /A expression SET /P variable=[promptString]/p 是让你输入/a 是指定一个变量等于一串运算字符 什么参 ...

  4. 批处理中setlocal enabledelayedexpansion的作用详细整理

    转自:https://www.jb51.net/article/29323.htm 设置本地为延迟扩展.其实也就是:延迟变量,全称延迟环境变量扩展, 想进阶,变量延迟是必过的一关!所以这一部分希望你能 ...

  5. linux 在批处理中,完整路径有空格的处理方式(加引號)

    cp -f E:/XML_EDITOR/xmleditor25/xmleditor/Editor_UIOuterCtrl/TraceViewDlg.cpp E:/XML_EDITOR/'XMLEdit ...

  6. OpenCV图像处理中“投影技术”的使用

           本文区分"问题引出"."概念抽象"."算法实现"三个部分由表及里具体讲解OpenCV图像处理中"投影技术" ...

  7. Excel怎样从一串字符中的某个指定“字符”前后截取字符及截取字符串常用函数

    怎么样可以从一串字符中的某个指定位置的前或后截取指定个数的字符. 如:12345.6789,我要截取小数点前(或后)的3个字符.怎么样操作, 另外,怎么样从右边截取字符,就是和left()函数相反的那 ...

  8. CSS截取截取字符长度并显示省略号的方法

    HTML部分 <div> <span>这是一个CSS3截取截取字符的例子.它根据宽度来处理.</span> </div> <div class=& ...

  9. Java异常处理中finally中的return会覆盖catch语句中的return语句

    Java异常处理中finally中的return会覆盖catch语句中的return语句和throw语句,所以Java不建议在finally中使用return语句 此外 finally中的throw语 ...

随机推荐

  1. oracle_单向函数_数字化功能

    oracle_单向函数_数字化功能 1.abs(x)   为了获得x绝对值 2.ceil(x)   用于获得大于或等于x的最小整数. 3.floor(x)   用于获得小于或等于x 4.mod(x,y ...

  2. NSIS:使用FileFunc.nsh头文件判断文件版本

    原文 NSIS:使用FileFunc.nsh头文件判断文件版本 这里,轻狂拿WMP10做一个例子.关于WMP10的原始安装文件,可以下载后通过/C /T:D:\Windows Media Player ...

  3. MYSQL 优化指南

    数据库设计原则   标准化和规范化 数据库设计范式(3NF)   第一范式 数据属性唯一标示 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关 ...

  4. U盘启动盘安装Win7/9/10系统攻略

    UltraISO制作U盘启动盘安装Win7/9/10系统攻略 U盘安装好处就是不用使用笨拙的光盘,光盘还容易出现问题,无法读取的问题.U盘体积小,携带方便,随时都可以制作系统启动盘. U盘建议选择8G ...

  5. 正则表达式 \b (转)

    引用网上一段话: \b 是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处.虽然通常英文的单词是由空格,标点符号或者换行来 ...

  6. 你的Java代码对JIT编译友好么?(转)

    JIT编译器是Java虚拟机(以下简称JVM)中效率最高并且最重要的组成部分之一.但是很多的程序并没有充分利用JIT的高性能优化能力,很多开发者甚至也并不清楚他们的程序有效利用JIT的程度. 在本文中 ...

  7. ubuntu 14.04 安装搜狗拼音输入法

    原文:ubuntu 14.04 安装搜狗拼音输入法 ubuntu桌面系统下终于有了好用的拼音法-搜狗拼音输入法,欲在ubuntu 14.04下安装搜狗拼音输入法相当的简单. 先到搜狗拼音官网下载对应的 ...

  8. Codeforces 135A-Replacement(思维)

    A. Replacement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  9. .NET 对象序列化和系列化德

    DataSet ds = new DataSet(); //给ds赋值(省略) byte[] b = this.Serialize(ds); DataSet d1 = this.DeSerialize ...

  10. mysql_常用命令

    1: 以指定编码创建数据库 CREATE DATABASE `search_data` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci