当前位置:首页文章首页 IT学院 IT技术

批处理(bat)学习的一些总结

作者:  来源:  发布时间:2012-1-11 14:01:50  点击:

这篇笔记是我对批处理学习的一些总结,能在系统帮助里找到的内容我就不写了,太偏门的也不写,只写些个人感觉很好用的技巧,大部分属于整理

一、set 篇:

1、set(无开关)

set .=test

set.

::若一个变量以:\.这三个与路径相关的符号开头,用set查看以该字符打头的变量时可以省去一个空格。

echo %tmp:*\=%

::显示tmp变量第一个\之后的部分,其余变量替换与变量偏移太简单不解释

2、set /p 变量名=注释<设备名

当设备名为文件时,因为文件中换行符与回车符伴生,所以只取文件第一行作为var变量的内容,但是不超过1024字节;而当设备名为nul或者com3时,只显示不换行的注释,这种情况下可以省略变量名(如:set /p=Hello World

3、set /a,最具技巧的命令之一

set /a n=1,m=2

::同时把不同数值分别赋予两个变量

set /a a=b=c=d=e=f=1

::用一条算式为多个变量同时赋值

set /a "1/n" 2>nul||echo 变量n非纯数字或为零

::利用分母不能为0的特征,用set判断一个变量是否为非零纯数字

set n=1

set /a "n=!!123|!!234&!!0"

::位运算,!、^、|和&常用于布尔运算,而逻辑位移常用于二进制运算(>>还可判断数值是否为负,见下例)

set /a n=-100,"1/(-100>>31)"||echo 变量n为负数

::顺应cmd中的正负数存储特点,可以用逻辑位移实现判断正负数的“布尔运算”,可以衍生出繁多的算法,比如稍加改动就可以比较两数甚至多个数的大小

set /a n=~-100

::利用~将所有二进制的1、0逆转,负号在后或在前配合可以实现简单加1或减1,这个技巧主要用来减少括号的使用,因为~号与负号的优先级都是高于算数运算符的

set /a test=%test:~5,1%-0

::可以避免%test:~5,1%为空时出错的情况

set /a 十进制=0x十六进制,十进制=0八进制

::快速将十六进制与八进制数转为十进制,可惜没有二进制...

:loop

set /a n+=1001

echo %n:~-3%

goto loop

::这比常规的补位方法更优越

for %%a in (test 123 ABC test @#$ 123) do set /a ".%%a+=1"

set .|findstr /v /e "=1"

::经典的获取字符串的重复次数的方案

二、for 篇:

这是批处理中最强的内部命令,没有之一!

1、for(无开关)

for %%a in (c:\*.*) do echo %%a

::显示C盘根目录下所有非隐藏、非系统属性文件

for %%a in (.\..) do echo %%~nxa

::显示上一级目录的文件夹名

set str=123,234,345

set str=%str:,=\%

for %%a in (%str%\..) do echo %%~nxa

::用前一个技巧,巧取倒数第二段字符串,与for /f "delims=\"相映成趣

for %%a in (*.txt) do (

for /f "useback delims=" %%b in ("%%a") do (

set str=%%b

for %%c in ("!str:分隔符=" "!") do (

for /f "tokens=1*" %%d in (%%c) do echo %%~d

)

)

)

::不带参数的for与for /f配合,威力极大,仅举此一例

for %%a in (123) do for %%a in (234) do for %%a in (345) do echo %%a

::其实如果只读取最后一层for的参数,即使多层for嵌套也可以使用同样的参数,比如%%a

for %%z in (!tmp!) do echo !%%z!

::目前已知的摆脱call实现多层变量嵌套的最好方法,不少人用

2、for /l

for /l %%a in () do echo 

::无限循环,步数为0也是一样的效果,但是没这个简洁

for /l %%a in (-4 1) do echo %%a

::for /l中的三项参数从左至右的三位分别是初始值、步数、终止点,当用户给定的数量不足时,将按从右至左的顺序把不足的一项赋为0

3、for /d /r

for /r /d %%a in (*) do echo %%a

::可以遍历所有子文件夹,之所以可以联用r开关和d开关是因为它们的参数有交集,l开关和f开关就不行了。

4、for /f

for /f本身的技巧并不是特别多,它的优势是能够将其他命令的输出作为输入来分析,所以for /f可以说是当之无愧的内部命令之王

for /f "tokens=* delims=0123" %%a in ("0000123456") do echo %%a

::去除前缀的n个字符

for /f "skip=99" %%a in (1.txt) do echo 1.txt至少100行

::以前看到某版主写的,印象颇深。

for /l %%a in (1 1 10) do (

for /f "tokens=1,2* delims=\" %%a in ("!tmp!") do (

for %%c in (%%a %%b) do echo %%c

set tmp=%%c

)

)

::将tokens的取值范围无限拓展

set tmp=123=234=345=456

for /l %%a in (1 1 40) do (

for /f "tokens=1,2* delims==" %%a in ("!tmp!") do (

set str=!str!,%%a,%%b

set tmp=%%c

)

)

echo %str:~1%

::有时候set变量替换是无法替换一些特殊字符的,此时可以用for /f处理

set test=d:\test\

for %%a in (test.*) do (

if "%%~za" neq "%%~z$test:a" replace /p /u "%%a" "%%~dp$test:a"

)

::判断当前目录下以test为名的文件是否在d:\test\文件夹下存在同名文件,如果存在且大小不同、修改日期更早,则替换之,否则不做处理。for帮助信息中的“%%~dp$path:a”参数似乎没见人用过,虽然它的适用范围很狭隘,但是特定的情况下不妨一试。

setlocal enabledelayedexpansion

set t=tmp

set @=t

for /f %%a in ('echo !%@%!') do echo !%%a!

::另一种三层嵌套方法,其实不实用。

三、findstr 篇

我最钟爱的命令,可惜外部命令的启动速度太慢,所以实际运用时较少露面。

findstr /s /m .* *.*

::其实findstr也是一个dir,虽然比dir慢些,却多了查找文件内容的功能

findstr /n .* 1.txt|findstr "^5000:"

::非常实用的取指定行的方法,配合正则可以取指定范围之内的行

set /p n=请输入数字或大小写字母

(echo !n!)|findstr /i "[0-9a-Z]"&&echo 输入有误!

::这个够实用吧?不解释

dir|findstr ['-Z]

::利用findstr和if命令中字符的实际大小顺序实现查找含有宽字符的行

findstr /x ".........." 1.txt

::查找1.txt中10字节的行

(type 1.txt&echo;)|findstr /o .*|more +1

::加上for,很容易获取1.txt每行的字节数

findstr>1.txt /m /p .* *.*

dir /b /a-d|findstr>2.txt /v /i /m /g:1.txt

::获取含有不可打印字符的文件名,关键是findstr取集

findstr "^Rar!" /g:1.txt

::此处1.txt是上个技巧的1.txt,内容是所有含不可打印字符的文件列表,此技巧可搜索rar文件,虽然简单,但是至今也未出错过,原创。

more>tmp +2 1.txt

findstr>前两行.txt /x /v /g:1.txt 2.txt

::有时候可用此办法获取前几行,当然,绝大部分情况下没有for /f合适,而且存在特殊字符bug

@echo off

findstr /n .* 1.txt>tmp1

find /n /v "" 2.txt|more>tmp2 +2

for /f "tokens=2*delims=]:" %%a in ('fc /n /lb10000 tmp1 tmp2^|sort') do (

echo;%%b

)

del tmp?

pause

::qzwqzw首创用fc /n同时输出双文本的思路,但是存在排序有可能被打乱的缺陷,所以加了个find弥补一下

首页 上一页 [1] [2] [3]  下一页 尾页

文章评论

软件按字母排列: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z