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

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

作者:  来源:  发布时间:2012-1-11 14:01:50  点击:
四、start、call、cmd 篇

之所以放在一起,是因为这三个命令的功能有所交集

1、start

@echo off

%1 cd.>tmp

set /p=%1

%1 start /b "" %0 :(五秒后退出) tm

if not "%1"=="" goto %1

set /p n=输入任意字符

if defined n (

del tmp

echo 您输入的是%n%,五秒后退出。

) else echo 输入为空!五秒后退出。

:(五秒后退出)

ping /n 5 localhost>nul

if exist %2p exit

pause

::妙用start /b让set /p实现choice的延时功能,不知道哪位前辈首创的,再次赞一个。此处%1、%2的技巧仅作点缀,我只是觉得这样“搭积木”很好玩才强加上去的。

2、call

set a=b

set b=c

call echo %%%a%%%

::不使用变量延迟仍然可以借助call实现变量的延迟读取与嵌套,但是效率上有缺陷

3、cmd

set a=b

set b=c

cmd /c echo %%%a%%%

::这证明call一个命令时的效果近似于cmd /c,二者的区别体现在"for"和"if"这两个命令不能用call运行,因为for和if其实可能只是关键字,而非真实存在的命令

set a=b

set b=c

cmd /v:on /c echo !%a%!

::不需要setlocal,照样可以使用变量延迟

%1 %0 :: echo;成功调用自身

%2

::个人很常用,这里用%1和%2的技巧为我所偏爱,那个::可以视情况换为rem。虽然此处并未出现cmd命令,但其实运行自身时执行的就是cmd /c %0。

@echo off

%1 cmd /v:on /c %0 ::

set n=123

echo !n!

pause

::综合前两个技巧实现不使用setlocal,开启变量延迟

@echo off

set str=test测试1234

setlocal enabledelayedexpansion

for /f "delims=:; " %%a in ('((cmd /u /c echo !str!^)^&echo^;^;^)^|findstr /o ^;') do set /a n=%%a-5

for /f "delims=:" %%a in ('((echo !str!^)^&echo^;^;^)^|findstr /o ^;') do set /a d=n-%%a+3

set /a m=n/2,s=m-d

echo 共!m!个字符,!d!个单字节字符、!s!个双字节字符

pause

::三步判断单字符、双字符个数的另类办法。优势在于支持对超长字符串进行计算(此时用常规算法步骤多且难通用),缺点在于效率低。

ren 1.exe 1.bat

echo 请双击1.bat

::为什么这样也可以运行呢?因为exe的打开方式是"%1" %*,bat是cmd /c "%1" %*,所以把exe当做bat运行时,相当于cmd /c 1.exe...不过这只适合双击打开,在cmd内部调用此文件的时候是当成真正的bat运行的,所以会出错。

五、其他命令 篇

1、xcopy比copy强大得多,最大的遗憾在于它是外部命令

xcopy /a 源文件夹 目标文件夹

::xcopy用在筛选上也很实用

xcopy /l /y /n %cd% ..

::巧取当前目录下文件的短名,并不会真的复制

xcopy /d:1-31-2011 /l "%cd%" tmp\

::获取修改日期在2011年1月31日以后的文件清单

xcopy /t *.txt C:\test\

::复制含有txt文件的目录结构到C:\test

@echo 1.txt>list

xcopy /exclude:list ?.txt test\

::复制所有以单个字符为名的文件到test文件夹

xcopy /s *.txt ..\txt\

::复制所有以txt为名的子文件到上一级目录中的txt文件夹

for /f "delims=" %%a in ('dir /s /b /ad^|sort -r') do rd "%%a" 2>nul

::删除空文件夹的经典思路,利用rd默认不删除非空文件夹的特性进序删除空文件夹

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

xcopy /q /h /r /s /k "%%a" "tmp\"

rd /s /q "%%a"

ren "tmp" "%%a"

)

::删除空文件夹的另类方案

2、相比于前面几个大佬级的命令,这些命令算是比较不起眼的了,所以归在一类

copy nul+Unicode.bat 解密.bat

::用Unicode文件头来进行编码混淆加密的bat,可以用这条命令解密

echo>tmp 12323412 2323242134122434 345

more /t20 tmp>对齐.txt

type 对齐.txt

pause

::more命令的t开关也有大用途,潜规则不解释。

cmd /u /c echo 0123456789|more

::more命令会将cmd /u输出的nul字符转换为空格,从而实现逐字打印一行单字节字符。

@echo off&setlocal enabledelayedexpansion

set n=32768

(for %%a in (16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do sort /rec !n! %0&&set /a n-=%%a||set /a n+=%%a)>nul 2>nul

echo 最长行有%n%个字符

pause

::当最长的行字符数大于128时可能可以用这个来判断最长行的字符数(短于128时rec开关会失效,代码中那一大堆2的N次方就是凑字数的,实战中可以省掉一些),支持超长字符串,计算大文件时效率明显优于传统算法,新折半法来自plp626的转帖,sort的/rec开关比较鸡肋,想来想去也只想到这个用途,未见先例

ren 1.exe 1.bat

echo 请双击1.bat

::为什么可以把exe改为bat后缀名运行呢?因为exe的打开方式是"%1" %*,bat是cmd /c "%1" %*,所以把exe当做bat运行时,相当于cmd /c 1.exe...不过这只适合双击打开,在cmd内部调用此文件的时候是当成真正的bat运行的,所以会出错。而且基于同样的原因,它还可以改成com或者cmd后缀名来执行。

3、再介绍一些在cmd窗口中的技巧,当然它们仅仅是“欺骗”cmd窗口,一旦输出到文件就原形毕露:

@echo off

echo 1

echo 2

echo 3

echo 退行了

pause>nul

::这个太牛了,不知道哪位发现的

set "dq= "

(echo 2、计划生育的重要性%dq%啊

echo 1、贯彻落实科学发展观%dq%哇)|sort

::借助tab键与退格符实现多行捆绑排序并错行显示,tab与退格之间的那个空格是关键,否则变为退行

set /p=同一行显示不同颜色:

set /p=红底蓝字

echo  黄底绿字

findstr /a:41 .* 红底蓝字?

findstr /a:62 .* 黄底绿字?

del>nul 红底蓝字 黄底绿字

pause

::经常见到的在同一行显示不同颜色的办法,不过很多人总是用    (四个退格四个空格),说明没理解退格键的意义

@prompt $_

dir fuck.tmp

pause

::利用这个prompt,打开回显后可以同时输出命令与命令结果,而不会有多余内容,适合制作bat运行日志

echo 

::这个黑色的圆点在前面的介绍中作为配角出现过,是ansi码中的0x07,也等同于在cmd中输入的ctrl+G,它每次被显示在屏幕上时都会发出“滴”的一声,所以以后findstr *.*时一定要留神了(除非不得已,否则需要把结果显示到窗口时建议加上/p开关),万一不小心打印出几万个,你的电脑会像发电报一样响个不停,我中招N次了...

六、cmd运行机制 篇

1、预处理机制:特殊字符优先级、语句和语块的划分

setlocal enabledelayedexpansion

(set n=3

set /a n=2,n=%n%+!n!+n)

::利用预处理机制,将一个变量解释为多个值

setlocal enabledelayedexpansion

echo ^^!

::当语句中存在变量延迟符号时,将被预处理两次,这是一定要注意的

set str=.

set "str name=str"

for %%a in (%tmp%) do if defined %%a echo %%a 存在变量str

::利用for的参数变量在if参数划分之后才被解释的特点,弥补if defined对于空格变量名的兼容性缺陷,本质原因是for和if都是特殊的函数,他们的参数设置在语块的预处理中就已经被cmd“记住”了,之后无法对其进行改变。

首页 上一页 [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