批处理中字符串的切片操作(和Python的切片运算很相似)(兼批处理复习笔记)

最近学习Python,感觉Python里面的切片运算截取字符串非常方便,想不到批处理也可以。
切片操作符在python中的原型是

seq[start:stop:step]
start:同其它语言一样,从0开始。序列从左向右方向中,第一个值的索引为0,最后一个为-1
stop:切片操作符将取到该索引为止,注意:不包含该索引的值。
step:默认是一个接着一个切取,如果为2,则表示进行隔一取一操作。步长值为正时表示从左向右取,如果为负,则表示从右向左取。步长值不能为0

在批处理中,也类似。比如默认时间日期在Server 2008 R2中是保持在%date%变量里面的。
日期格式如下:

C:\Users\Administrator>echo %date%
2010/10/09 周六

截取前四个字符(年份)

C:\Users\Administrator>echo %DATE:~0,4%
2010

截取中间6-7个字符(月份)

C:\Users\Administrator>echo %DATE:~5,2%
10

截取中间9-10个字符(日期)

C:\Users\Administrator>echo %DATE:~8,2%
09

例如把当前日期格式2010/10/09转化为2010-10-09日期格式

echo %DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%
2010-10-09

切片原型:
%STR:~start,length%
start:起始索引,不含在被切字符内,1表示第一个。
length:从start开始所切取的字符长度(不含start在内)。


发几个批处理实例:

[text]
@echo off
if "%TIME:~0,2%" lss "12" (
if "%TIME:~0,2%" lss " 6" (
echo 现在是凌晨
) else (
echo 现在是上午
)
) else (
if "%TIME:~0,2%" lss "18" (
echo 现在是下午
) else (
echo 现在是晚上
)
)
pause[/text]

lss等比较字符可以用if/? 中获得(临时切换到英文状态用chcp 437)

数值型变量的比较和运算

[text]
@echo off
set /a num=5

if %num% == 5 (
echo 变量 num 等于 5
)

if not %num% == 4 (
echo 变量 num 不等于 4
)

set /a num = ( %num% + 3 ) * 2
:: 变量 num 加3并乘2后再赋给变量 num 自身

if %num% == 16 (
echo 经过运算后,现在变量 num 等于16
)

if not %num% == 16 (
echo 此时的变量 num 不会不等于 16 ,因此这一句不会显示了
)

pause
[/text]

延迟变量扩充。考虑到读取一行文本时所遇到的目前扩充的限制时,延迟变量扩充是很有用的,可以让 for 或 if 后面的执行语句中变量的值随其变化,而不是在执行的时候。下面的例子可以很好的说明直接变量扩充与延迟变量扩充的区别。

在“for if else”等含有语句块的语句和用“& | && ||”等连接起来的复合语句中需要使用延迟变量扩充。

在需要使用变量里套变量也可以使用变量延迟,如:
set a=1000
set b=dd
set a%b%=9000
set c=!a%b%!

[text]
@echo off
setlocal EnableDelayedExpansion

set /a num=5

if %num% == 5 (
set /a num*=3

echo 在 if 语句之前,变量 num 等于 %num%
echo 但变量 num 在经过运算后,且由于延迟变量扩充被启用,变量 num 等于 !num!
)

echo 但最终变量 num 还是等于 %num%

pause
[/text]

if 条件下的两行 echo 在输出变量值的时候用到的符号不一样,一个是用百分号 % 包括起来的,另一个用的却是惊叹号 ! 。虽然在显示 %num% 之前已经使变量 num 的数值乘了3倍,但是由于没有延迟变量的扩充,使得 %num% 的结果仍然是 5 。但用 !num! 显示出的值已经变为 15 了。注意到批处理中的 setlocal EnableDelayedExpansion (setlocal/? 查看相关信息),这表示开启延迟变量扩充。此时的 !num! 才有意义。不然 !num! 将无法被识别,因为在默认情况下,延迟变量扩充是被停用的。

for 循环语法(包含start和stop两个端点)

for /l %i in (start,step,stop) do echo %i

直接在命令提示符里以命令的形式表达出来的写法,在批处理文件中需要用连续的两个百分号 %% 来描述循环变量 i (%i要写成%%i),而不是一个,%是批处理里面的转义字符,% 不仅仅将与其相关的特定字符串转义并替换为特定字符串,而且自身也会被“脱逸”。而且类似于C语言中的转义字符 \ ,双%会转义并脱逸为单百分号 % ,四%则脱为双百分号 %%。

for 也可以对指定范围内的文字进行循。for 后面跟参数 /f ,/f 后面跟选项,所指定的范围 in 里可以是一个文件里的文字,可以是一个字符串,也可以是一条命令的输出结果。(这就是我想要的)

[text]
@echo off
set Text=Hello,world!
for /l %%i IN (0,1,11) do call echo %%Text:~%%i,1%%
pause
[/text]

遍历Text变量里面的每一个字。
再上一个例子

[text]@echo off
echo 测试 文字筛选.txt 里每一行的首单词
for /f %%i in (文字筛选.txt) do echo %%i
pause

echo.
echo skip=2 表示前两行被跳过
for /f "skip=2" %%i in (文字筛选.txt) do echo %%i
pause

echo.
echo tokens=2,4-6 表示提取每行的第2个、以及第4到6个单词
echo tokens=*表示遍历所有。
for /f "skip=2 tokens=2,4-6" %%i in (文字筛选.txt) do echo %%i, %%j, %%k, %%l.
pause

echo.
echo eol=N 表示当此行的首字母为 N 时,就忽略该行
for /f "eol=N skip=2 tokens=2,4-6" %%i in (文字筛选.txt) do echo %%i, %%j, %%k, %%l.
pause

echo.
echo delims=e 表示不再以空格区分每个词,而是以字母 e 作为间隔
for /f "eol=N skip=2 tokens=2,4-6 delims=e" %%i in (文字筛选.txt) do echo %%i, %%j, %%k, %%l.
pause

echo.
echo usebackq 表示双引号里的东西是文件名而不是字符串
for /f "usebackq eol=N skip=2 tokens=2,4-6 delims=e" %%i in ("文字筛选.txt") do echo %%i, %%j, %%k, %%l.
pause
[/text]

文字筛选.txt:

Hello there!
This text is an example of test for the batch file 文字筛选.bat.
Notice the first letter in this line, N.
If the eol charactor was set to be letter N.
The third line will not be considered by the batch


获取本机默认路由:

[text]
for /F "tokens=3" %* in ('route print ^|findstr "\<0.0.0.0\>"') do set "gw=%*"
echo %gw%
172.16.156.1
[/text]

FINDSTR采用正则表达式匹配字符串,http://blog.chinaunix.net/u3/116013/showart_2287310.html


越补充越多了。干脆都记下来吧:

下面这些组合命令和linux shell有部分相通之处

&
& 在多个命令之间所起的连接作用。命令之间是相互独立的关系。不论三者中每一条命令的结果如何,后面的一条命令总能被得到执行(这是与 && 和 || 的不同之处)。

&&
&& 与 &的不同之处是如果多命令中的某一条命令执行出错时,后面的所有命令将不会再被执行

||
|| 的用途与 &&的功能恰好相反。当遇到执行正确的命令后将不再执行后面的命令,如果没有出现正确的命令则一直执行完所有命令。

在混合使用的时候需要注意它们的优先级。

prompt命令,更换"提示符",NT默认是路径名和大于号组成,Linux默认则是#路径。

比如切换为linux风格的提示符

prompt #[$P]
prompt #
::恢复路径名和大于号为开头的提示符,
prompt $p$g
::或者直接键入空命令
prompt

$p 表示当前驱动器和路径, $g 表示大于号。具体的说明可以用 help prompt 来查询。

还有一个不得不说了。批处理里面的跳转标签可以当函数用,传递的参数和linux shell里面的一样,把goto换成call即可

@echo off
call :FirstLable 很好很强大

:SecondLable
echo 然后显示这句
pause
goto :EOF

:FirstLable
echo 首先显示这句,后面跟的参数为 %1
pause

Over!
部分内容整理自:http://hi.baidu.com/zzzzz_why/blog/item/e8765382745eb4a70df4d255.html

Author Info :
  • From:批处理中字符串的切片操作(和Python的切片运算很相似)(兼批处理复习笔记)
  • URL:https://blog.ihipop.com/2010/10/1677.html
  • Please Reserve This Link,Thanks!
  • 《批处理中字符串的切片操作(和Python的切片运算很相似)(兼批处理复习笔记)》上有3条评论

    发表回复

    您的电子邮箱地址不会被公开。 必填项已用 * 标注