批处理学习笔记

DOS和批处理的基础知识

DOS常见的有两种:IBM公司的PC-DOS和微软公司的MS-DOS(常用) 

分为核心启动程序和命令程序两个部分:
1)核心启动程序有:Boot系统引导程序、IO.SYS、MSDOS.SYS和COMMAND.COM,有了它们系统就可以启动;
2)命令分为内部命令和外部命令:内部命令存在于COMMAND.COM文件中,会在系统启动时加载到内存中,以方便调用。而其它的一些外部命令则以单独的可执行文件存在,在使用时才被调入内存。进入DOS: 在系统引导、出现"Starting Windows....."的时候按下"F8"键,然后再选择"Command Prompt Only"即可进入DOS方式。

批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为.bat或.cmd。是自上而下、逐条(不是逐行)执行的。

DOS批处理中符号作用大全

@
\\隐藏命令的回显;                                          

~
\\在for中表示使用增强的变量扩展;
在set中表示使用扩展环境变量指定位置的字符串;
在set /a中表示按位取反。

%
\\使用两个%包含一个字符串表示引用环境变量。比如一个%time%可以扩展到当前的系统时间;
单个%紧跟0-9的一个数字表示引用命令行参数,%0默认给批处理的文件名使用;
用于for中表示引用循环变量;
连续的两个%表示执行时脱为一个%。

^
\\取消转义字符,即将所有转义字符的转义作用关闭。比如要在屏幕显示一些特殊的字符,比如> >> | ^等时,  就可以在其前面加一个^符号来显示这个^后面的字符了,^^就是显示一个^,^|就是显示一个|字符了;
在 set/a中是按位异;
在findstr /r的[]中表示不匹配指定的字符集。

&
\\用来连接n个DOS命令,并按顺序执行,而不管是否有命令执行失败;    
在set /a中是按位与。

*
\\代表任意个任意字符;
在set /a中是乘法。比如"set/a x=4*2",得到的结果是8;
findstr /r中表示将前一个字符多次匹配。

()
\\命令包含或者是具有优先权的界定符吧,比如for命令要用到这个(),我们还可以在if,echo等命令中见到它的身影;

-
\\范围表示符,比如日期的查找,for命令里的tokens操作中就可以用到这个字符;
在findstr/r中连接两个字符表示匹配范围;
跟在某些命令的/后表示取反向的开关。

+
\\主要是在copy命令里面会用到它,表示将很多个文件合并为一个文件;
在set /a 中是加法。

|
\\管道符。就是将上一个命令的输出,作为下一个命令的输入.
"dir /a/b | more"就可以逐屏的显示dir命令所输出的信息;
在set/a中是按位或;
在帮助文档中表示其前后两个开关、选项或参数是二选一的。

:
\\标签定位符,可以接受goto命令所指向的标签。

" "
\\界定符,在表示带有空格的路径时常要用""来将路径括起来,在一些命令里面也需要" "符号;
在for/f中将表示它们包含的内容当作字符串分析;
在for/f "usebackq"表示它们包含的内容当作文件路径并分析其文件的内容;
在其它情况下表示其中的内容是一个完整的字符串,其中的>、>>、<、&、|、空格等不再转义。

/
\\表示其后的字符(串)是命令的功能开关(选项)。比如"dir /s/b/a-d"表示"dir"命令指定的不同的参数;
在set/a中表示除法。

>
\\输出重定向命令, 清除文件中原有的内容后再写入;
在findstr/r中表示匹配单词的右边界,需要配合转义字符\使用。

>>
\\输出重定向命令, 追加内容到文件末尾。

<
\\将其后面的文件的内容作为其前面命令的输入。(more < a.txt)
在findstr/r中表示匹配单词的左边界,需要配合转义字符\使用。

=
\\赋值符号,用于变量的赋值。
比如"set a=windows"的意思意思是将"windows"这个字符串赋给变量"a";
在set/a中表示算术运算,比如"set /a x=5-6*5"。

\
\\这个"\"符号在有的情况下,代表的是当前路径的根目录. 
比如当前目录在C:\windows\system32下,那么你"dir \"的话,就相当与"dir c:\"
在findstr/r中表示正则转义字符。

''
\\在for/f中表示将它们包含的内容当作命令行执行并分析其输出;
在for/f "usebackq"中表示将它们包含的字符串当作字符串分析。

.
\\在路径的\后紧跟或者单独出现时:一个.表示当前目录,两个.表示上一级目录;
在路径中的文件名中出现时:最后的一个.表示主文件名与扩展文件名的分隔。


\\当启用变量延迟时,使用!!将变量名括起来表示对变量的引用;                  
在set /a 中表示逻辑非。                                                

&&
\\连接两个命令,当&&前的命令成功时,才执行&&后的命令;

||
\\连接两个命令,当||前的命令失败时,才执行||后的命令。

$
\\在findstr命令里面表示一行的结束。

``(与~在同一键上)
\\在for/f中表示它们所包含的内容当作命令行执行并分析它的输出。          

[]
在帮助文档表示其中的开关、选项或参数是可选的;
在findstr/r中表示按其中指定的字符集匹配。

?
\\在findstr/r中表示在此位置匹配一个任意字符;       
在路径中表示在此位置通配任意一个字符;
紧跟在/后表示获取命令的帮助文档。

::
\\注释命令,和rem命令等效,执行时不显示,也不起任何作用,增加脚本的可读性  

>&
\\将一个句柄的输出写入到另一个句柄的输入。   

<&
\\刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。

批处理常用命令及用法大全

dir
显示指定目录上所有文件或目录的信息           

md 
建立目录                                                                      

rd                                                                             
删除目录                                                                   

cd                                                                       
进入指定目录("CD \"为回到根目录,"CD.."为回到上一层目录)                

copy                                                                          
拷贝文件,不可以复制子目录.                                                                      

xcopy                                                                                 
拷贝命令,带上参数 /S 可以拷贝文件和其子目录                                                                    

del                                                                  
删除文件

ren                                                                           
文件重命名                                                                   

cls
清除显示器屏幕上的内容,使DOS提示符到屏幕左上角。   

type                                                                         
显示文本文件内容                                                           

title                                                                                                                                                                       
设置cmd窗口的标题                                                          

ver
显示正在运行的DOS系统版本号   

vol                                                                          
显示指定的磁盘卷标号 

date                                                                              
系统日期

time                                                                             
系统时间                                                                     

echo                                                                        
1、显示信息 2、直接编辑文本文件(echo Helo world! > a.txt)                 

echo off                                                                        
关闭回显,即不显示以后各行中的命令本身                                                     

pause                                                                         
让当前程序进程暂停一下,并显示一行信息:请按任意键继续. . .       

rem                                                                           
注释命令                                                                

goto                                                                           
跳转命令                                                                           

more                                                                         
让输出的信息逐屏(space)或逐行(enter)显示

tree                                                                         
显示目录结构                                                                

start                                                                           
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用                                            

call                                                                            
批处理中调用另外一个批处理的命令

find                                                                         
在一个文件或多个文件中搜索指定的文本字符串,搜索到后将显示出包含指定字符串的所有行。
find [/v] [/c] [/n] "string" [[drive:][path]filename[...]]             
/v   显示未包含指定字符串的所有行。                                           
/c   只显示包含指定字符串的行数。                                            
/n  将文件行号置于每行开头。                                                
/I  指定搜索不区分大小写。  

sort                                                                         
命令按字母顺序排列文件和命令输出 sort < list.txt > alphlist.txt                                                               

shift                                                                        
更改批处理中可替换参数的位置  shift /2       将 %3 改为%2,将 %4 改为 %3 等等,而 %0 和 %1 保持不变                                          

subst                                                                                                                                                               
映射磁盘。
subst z: \\server\d     #这样输入z:就可以访问\\server\d
subst z: /d             #取消该映射
subst                   #显示目前所有的映射

set                                                                           
设置变量
引用变量可在变量名前后加 % ,即 %变量名%

ping                                                                           
用于检测网络通与不通 ,也叫时延,其值越大,速度越慢                 

errorlevel                                                                     
程序返回码。
echo %errorlevel%每个命令运行结束,可以用这个命令行格式查看返回码用于判断刚才的命令是否执行成功默认值为0,一般命令执行出错会设 errorlevel为1,以下就是几个常用命令的返回值及其代表的意义:
backup
0 备份成功
1 未找到备份文件
2 文件共享冲突阻止备份完成
3 用户用ctrl-c中止备份
4 由于致命的错误使备份操作中止
diskcomp
0 盘比较相同
1 盘比较不同
2 用户通过ctrl-c中止比较操作
3 由于致命的错误使比较操作中止
4 预置错误中止比较
diskcopy
0 盘拷贝操作成功
1 非致命盘读/写错
2 用户通过ctrl-c结束拷贝操作
3 因致命的处理错误使盘拷贝中止
4 预置错误阻止拷贝操作
format
0 格式化成功
3 用户通过ctrl-c中止格式化处理
4 因致命的处理错误使格式化中止
5 在提示“proceed with format(y/n)?”下用户键入n结束
xcopy
0 成功拷贝文件
1 未找到拷贝文件
2 用户通过ctrl-c中止拷贝操作
4 预置错误阻止文件拷贝操作
5 拷贝过程中写盘错误

if                                                                               
1.检测字符串:if[not] "%1"=="" goto usage   if [not] string1==string2 do command
2.检测数值:(注意,批处理中大于符号不能用:“>”,而用"gtr",其它的也类似)
比较运算符一览:
equ - 等于    neq - 不等于    lss - 小于    leq - 小于或等于    gtr - 大于    geq - 大于或等于
3.存在判断:if [not] exist filename do command                                                                      
4.结合defined使用,可以用来检测某个变量是否已经被定义   if defined str1 echo str1已经被定义                                         
5.结合errorlevel使用: 环境变量errorlevel的初始值为0,当一些命令执行不成功,就会返回一个数值,如1,2等。if[not] errorlevel number do command

for                                                                         
一、for语句的基本用法:                                                          
在cmd窗口中:for %variable in (command1) do command2                     
在批处理文件中:for %%variable in (command1) do command2   

二、for语句的一些注意事项:                                                
1、for、in和do是for语句的关键字,它们三个缺一不可;               
2、%%variable是for语句中对形式变量的引用,就算它在do后的语句中没有参与语句的执行,也是必须出现的;
3、in之后,do之前的括号不能省略;                                          
4、for语句的形式变量variable会区分大小写;
 5、command1每个元素之间,用空格键、跳格键、逗号、分号或等号分隔;
6、for语句依次提取command1中的每一个元素,把它的值赋予形式变量variable,带到do后的command2中参与命令的执行。 

三、带参数 /L 的for (这里的 参数/L 可以理解为 "list" 的意思,代表一个数列)
for /l [%% | %]variable in (start,step,end) do command [command-parameters](迭代)
例:for /l %%i in (1 1 5) do echo %%i    显示结果为:1 2 3 4 5(每字一行),就是以1开始,步长为1,结束值为5的一个等差数列。

四、带参数 /D 的for(常用来查询 当前目录 或者 指定目录的文件夹)
for /d [%% | %]variable in (set) do command [command-parameters]     
如:查询F盘根目录下的文件夹 :
for /d %%i in (f:\*) do echo %%i

五、带参数/R的for(检查以 [drive:]path 为根的目录树中,所有符合(set)的文件或者文件夹。如果在 /R 后没有指定目录,则使用当前目录)            
for /r [[drive :]path] [%% | %]variable in (set) docommand [command-parameters]                                                             
如:枚举F:盘下所有的 .bat文件(包括子目录):
for /r f:\ %%i in (*.bat) do echo %%i

六、带参数/F的for(这里的参数/F可以理解为“file”的意思,代码处理对象为文本串,用于文本解析)
for /f ["options"] [%%|%]variable in (set) do command             
options详解:                                                      
eol=c      忽略以指定字符打头的行,默认为分号(;),只能指定一个           
skip=n       指定在文件的开头跳过的行数。                         
delims=xxx       指定定界符集合,用以切分字符串,这将替换空格和制表符的默认分隔符集。                                                     
tokens=x,y,m-n    用于定点提取,这将导致分配其他变量名。m-n 格式是一个范围,如果最后一个字符是星号(*),则将分配附加的变量,并在解析最后一个令牌后在行上接收剩余的文本。 
@echo off
for /f "eol=, skip=3, delims=;. tokens=1,3-5,*" %%i in (test.txt) do echo %%i %%j %%k %%l %%m
pause                                                                
usebackq      指定将右引号字符串(``)作为命令执行,单引号字符串(‘’)是文字字符串命令,可以使用双引号包括文件名。                         
1、for /f %%i in (文件名) do (……)                                    
2、for /f %%i in ('命令语句') do (……)                                  
3、for /f %%i in ("字符串") do (……)                                     
4、for /f "usebackq" %%i in ("文件名") do (……)                            
5、for /f "usebackq" %%i in (`命令语句`) do (……)                         
6、for /f "usebackq" %%i in ('字符串') do (……)    

net                                                                          
命令集合 http://bbs.bathome.cn/thread-589-1-1.html   

变量延迟

1、为什么要使用变量延迟?
因为要让复合语句内部的变量实时感知到变量值的变化。

2、在哪些场合需要使用变量延迟语句?
在复合语句内部,如果某个变量的值发生了改变,并且改变后的值需要在复合语句内部的其他地方被用到,那么,就需要使用变量延迟语句。而复合语句有:for语句、if……else语句、用连接符&、||和&&连接的语句、用管道符号|连接的语句,以及用括号括起来的、由多条语句组合而成的语句块。最常见的场合,则是for语句和if……else语句。

3、怎样使用变量延迟?
方法有两种:
a)使用 setlocal enabledelayedexpansion 语句:在获取变化的变量值语句之前使用setlocal enabledelayedexpansion,并把原本使用百分号对闭合(% %)的变量引用改为使用感叹号对来闭合(! !);
b)使用 call 语句:在原来命令的前部加上 call 命令,并把变量引用的单层百分号对(% %)改为双层(%% %%)。
Example:
@echo off                                                            
set num=0
for /f %%i in ('dir E:\*.txt') do (
     set /a num+=1
     echo num 当前的值是 %num%
 )                                                                                   
 屏幕上会提示N次 "num 当前的值是 0" ,而不是显示1到N(E盘下有txt文件,N是txt文件的个数)。
 这是一条复合语句,在预处理的时候, %num%只能被for语句之前的语句赋予变量num的具体值(0)来替换,而不能被复合语句for内部的set语句对num所赋予的值来替换,此num非彼num,要想显示1到N,就要使用变量延迟,有两种方法可以实现:
 方法一:                                                                            
 @echo off
 set num=0
 setlocal enabledelayedexpansion
 for /f %%i in ('dir E:\*.txt') do (
     set /a num+=1
     echo num 当前的值是 !num!
 )
 方法二:                                                                       
 @echo off
 set num=0
 for /f %%i in ('dir E:\*.txt') do (
     set /a num+=1
     call echo num 当前的值是 %%num%%
 )

posted on 2010-04-27 14:28  sanmao.net  阅读(382)  评论(0编辑  收藏  举报