中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 学习笔记 上一主题 | 下一主题
tempuser
高级用户





积分 547
发帖 261
注册 2006-4-15
状态 离线
『楼 主』:  学习笔记

曾经发过,但有点变化,希望我们初学者继续努力,共勉前进,也感谢所有帮助我们的人,谢谢!
2007-12-03
有WINDOWS为何还学DOS?
因为DOS在某些方面效率更高;学习Linux 交换机/路由器DOS更方便;远程控制。

目录列表:
一、入门与概述
二、DOS命令简介
三、批处理命令简介
四、技巧集合
五、断章取义
六、概念理解
七、DEBUG的学习
八.运算符学习

一、入门与概述
1.文件与目录
文件名:文件基本名+后缀
文件基本名:1-8个字符,对于文件名必须存在;后缀0-3个字符,可有可无。
目录:在Windows中称作“文件夹”。
用DIR显示时,后面跟有[dir]标志,表明它们是目录。
2.exe:可执行文件
com:命令文件
bat:批处理文件
它们都被称作“可执行文件”。
Bat后缀的文件优先级高于以exe和com为后缀的文件
3.DOS内部命令和外部命令
内部命令是由command.com随系统启动直接加载到内存中去的,可直接使用。
换句话说,内部命令存在于command.com文件中。
外部命令是一个个独立的文件,存在于磁盘中,需要时可调入内存执行。
4..和..与\
. :当前目录
.. :当前目录的上一级目录,也称“父目录”
\ :根目录。
5.Dir命令
当前目录存在.和..时,用dir命令显示当前目录信息时,它们被认为是一个文件,只是大小为零。
6、DOS启动顺序
启动——》IO.SYS——》MSDOS.SYS——》CONFIG.SYS——》COMMAND.COM——》Autoexec.bat
其中,IO.SYS、MSDOS.SYS、COMMAND.COM对于DOS系统的启动必不可少。
io.sys  : 输入输出处理程序
Msdos.sys  :文件处理程序
Command.com  :命令处理程序
新解:
对于DOS,硬盘启动时首先有INT19中断来读取“硬盘MBR”,读到后将MBR读到内存0000:007c,接着INT19也跳到内存中0000:007c,此时的控制权还是INT19,接着在MBR中“有一个程序”会寻找“可引导的分区”,找到后将引导分区读到0000:007c,这时MBR程序就会跳到0000:007c这个地址上,系统开始启动了。
主引导扇区是:0柱0磁头1扇区
之后就是FAT(文件分配表)了
补充(2007-12-10)
。DOS  :disk operating system,单用户单任务OS。
冷启动 :开机时,打开显示器电源-》主机电源,关机时顺序相反
热启动 :系统启动时,按CTRL+ALT+DEL组合键再次启动系统
二者区别 :是否跳过内存检测等一些硬件检测过程,其它运行过程相同
。DOS常用保留名
CON :键盘\显示器
NUL :空设备或虚拟设备
AUX/COM1 :第一串行通信接口
COM2\COM3\COM4 :第2、3、4串行口
LPT1\PRN :第一并行接口
。批处理文件可以理解成“一个DOS命令”
。为何不要将批处理文件命名为DOS的“内部命令或外部命令”?
答:如果与内部命令同名,则DOS内部命令优先级高于批处理,批处理文件不能执行;
   如果与外部命令同名,则取决于“先找到外部命令还是先找到批处理文件”,谁先被找到
   就先执行,因此,建议命名批处理时要避免与DOS的内、外部命令同名。
。DOS下创建批处理文件的方式?
  a    copy  con  要创建的批处理文件
  b    edit  要创建的批处理文件
。也可以用
  Pause  要显示的信息   有类似与   echo   要显示的信息
。如何让“批处理文件”鸣镝?(依靠计算机内置扬声器)
  在DOS下用edit  鸣镝.bat,之后进入编辑页面,先输入
  Pause在输入一个空格,之后在按住CTRL键,按“P”键,松开CTRL键,再按住CTRL键,在按“G”,即可生成一个“鸣镝控制符”。
  也可以按住CTRL键不松手,先后按“P”和“G”键。
  其实,用echo也能达到同样效果,只是在文本中输入控制符麻烦,可在DOS下编辑批处理文件,输入控制符并保存后在返回到Windows下编辑,不失为一个好办法。

二、DOS命令简介
1.Dir
显示当前目录信息,但不包括系统和隐藏文件
dir /p :分屏显示信息(p是page的缩写,即分页显示屏幕)
dir/w :用宽列表显示信息,没有文件大小和创建日期
dir/d :类似于dir/w显示方式
dir/b :只显示文件名,目录名也按照文件名方式显示,不显示目录名的[ ]标志(一种精简显示)
dir /l :以小写字母显示文件和目录
dir /a: :显示指定属性的文件,例:dir /a:r显示当前目录下的所有具有只读属性的文件
例:dir /a:d表示只显示目录信息
例:查找指定日期的文件  dir|find “2007-12-04”,注意日期的书写格式和本机日期显示匹配
例:在多级目录下查找文件,使用参数/s,如 dir temp /s,如果当前目录下有temp目录,temp下还有temp目录,则执行结果是列出最后一层temp目录下的所有文件
REM
dir/?看帮助,发现a后的:是可选的,但如果不用:,则会显示“当前的驱动器的卷没有标签,找不到文件”信息。
不用:,怎么又好使了?自己疏忽吧!
Dir /a:-r :显示当前目录下所有具有非只读属性的文件
-        :表示“否的前缀”。
REM


Dir /o: 按照分类方式显示信息,如文件大小、字母顺序等,例:dir /o:s表示按照文件大小显示信息;dir /o:n按照字母顺序显示信息
Dir /n :以“长文件列表方式显示,文件名在最右侧”
Dir /c :类似于dir/n
Dir/x :显示非8dot3命名规则的文件
例:dir >test.txt 表示将dir命令结果导入到一个文本文件里
2.Cd
Change directory改变目录
注意:如果在C盘使用如下命令
c:\>cd e:\test
结果仍在c:\>在,只不过在转到d盘,d盘的当前目录是d:\>test>,我在用at定期删除某目录下的文件就出了以上问题。
例:
@echo off
c:
rem 当时我望了转到c:,结果删除了批处理文件所在的磁盘很多文件,包括批处理文件本身
rem 使得at任务无法执行
cd "C:\Documents and Settings\All Users\Application Data\Symantec\Symantec AntiVirus Corporate Edition\7.5\Logs"
echo y | del *.*
Cd .. 表示回到上一级目录
Cd\  表示回到根目录
Cd  /d  参数/d表示即改变当前目录,也改变当前驱动器
3.Copy
功能是复制与移动,但不能复制目录中的子目录
例:合并两个文本文件1.txt和2.txt为3 .txt
Copy /a 1.txt+2.txt 3.txt
REM 按照ASCII码合并这两个文件
Copy /b 1.txt+2.txt 3.txt
REM 按照二进制合并这两个文件
     参数/a和/b不能一起使用,其中/a只能合并纯文本文件,而/b即能以文本方式合并,又能以二进制方式合并
例:加密文件
copy /b test.jpg+1.txt 2.jpg
REM test.jpg和1.txt变成一个文件2.jpg,这样文本信息得到了加密,需要查看该信息,可使用ultraedit软件查看
REM 记住,要加密的文档一定要放到+号右侧
4.Xcopy
可以将目录中的非空子目录复制到其它地方,但要使用参数/s
/e必须与参数/s同用,表示不仅可以拷贝子目录,空目录也可以拷贝

/v拷贝后许进行校验
5.Del
Delete
Del *.* 非常危险的命令
例:del /f  强制删除只读文件      Del/a  删除指定属性文件
6.ren
Rename
7.type
一次只能显示一个文件的内容
8.Format与unformat
格式华后的磁盘可利用空间等于磁盘总空间,说明磁盘性能不错
Format /u 表示无条件格式化,此时unformat无效
例:Echo y|formant a:
Unformat 盘符 表示恢复已格式化的磁盘
unformat /l  表示列出可恢复的文件列表
9.Md与Rd
新建目录
例:同时建立多个目录
md c:\1  d:\2  e:\3 等价于md c:\1;d:\2
删除目录,所删除的目录里不能有子目录和文件,如果想这样执行,可使用
Rd /s
例:建立一个加密目录及如何查看和删除它
md  test..\
Rem \的作用就是告诉系统建立文件夹时保留前面的两个..
Rem 实际建立的文件夹是test.,因为后面那个点.被当作“文件基本名和后缀的分隔符”了
这样就建立了一个“加密”的文件夹,双击无法打开它
可通过“开始”菜单中的“运行”或“资源管理器中的地址栏”输入它的“完整路径”查看
通过 rd /s /q删除它
思考:如果建立的“加密”文件夹和属性隐藏的方法包括注册表隐藏结合起来,就可以建立一个相对私秘的空间。
注册表大概位置:MACHINE\SOFTWARE\WINDOWNS\CURRENTVERSION\EXPLORER\ACVANCED\FOLEDR\SHWOALL\CHECKEDVALUE的值
10.Deltree
删除目录树,非空目录照删不误
Deltree *.*非常危险的命令
11.Mem
Memory
12.Chkdsk
Checkdisk
13.Sys
C:\>sys a:等同于format a:/s,都是制作系统启动盘
如果copy一张DOS启动盘,io.sys和msdos.sys这两个文件不一定能拷贝到磁盘最前面的磁道上
14.Cls
清屏
15.More
分屏显示
16.Move
例:@echo off
Cd c:\test
Move c:*.* a:
REM
    注意第3行“c:与*.*”之间没有“\”,这表示将当前目录即test目录下的所有文件拷贝 到A盘。
17.Help
人如其名
18.Attrib
Attribute
例:将c:\test目录下的所有文件和子目录(包括目录本身)都设置为“只读”属性
Attrib  +r  c:\test  /s  /d
/s  :表示对子目录进行操作
/d  :表示对目录进行操作,可简单理解为directory
例:将c:\test目录下的所有文件和子目录(不包括目录本身)都设置为“只读”属性
Attrib +r  c:\test\*.*  /s /d
19.Time与date
Date /t :不需输入新时间
Echo+|date|find “当前日期”
Echo+|time|find “当前时间”
例:可编写一批处理文件记录机器时间使用的状况
echo+|date/t>test.txt
Echo+|time/t>>test.txt
20.Lable
21.Defrag
整理磁盘碎片
22.Doskey
建立和调用DOS宏命令
例:doskey d=deltree,以后执行d就相当于执行deltree命令
例:如果在CMD下输入了很多的命令,需要再次使用这些命令而又不想重复输入时,可使用doskey,具体操作(在CMD):doskey /h(h是history)是查看曾经在CMD下已经使用的命令,可通过F9键调出它们的缓存表再次使用,也可以使用上下箭头或PaUp和PaDn键来操作,如果想清除他们,可使用doskey /reinstall。
23.Fdisk
Fdisk /mbr :重新建立DOS主引导记录
24.Memmaker
内存优化命令
25.Emm386
扩展内存管理
26.Lh 或loadhigh
将程序载入高端内存
27.Msd
系统检测
不能直接使用
28.Undelete
该命令使用前,需要使用lock命令,解除对硬盘目录区不让修改的限制
Undelete /all :恢复所有del的文件,不用询问
Undelete /list :列出可恢复的文件列表
29.Path
例:path c:\test
如果在当前目录下执行某命令,不存在,则在path设置的路径下继续寻找该命令,有则执行
30.Prompt
设置提示符,就是我们常见的c:\>,c:表示当前盘符是C盘,\表示根目录,>表示将提示符与待输入的命令分开
可以根据需要将c:\>改变
31.Backup与restore
备份与恢复
Restort /s :包括子目录恢复到指定的目录中
32.Edit
只能编辑文本文件,编辑的文件存在则编辑,不存在则临时建立该文本文件并进入编辑状态,如果保存就会在磁盘上建立该文件
33.Set
SET 命令不允许变量名含有等号
设置变量,在CMD下直接输入set命令,会列出绝大部分的系统变量
Set p        rem   列出所有以P打头的环境变量
例:清空变量值使其成为未定义状态
set  var=

set  var=””不是赋空值,该变量值是””。
例:set path=c:\test     rem  已经定义好的“自定义变量”。
等同于path c:\test
例:手动输入变量值
set /p a=请输入变量值    rem  等待用户手动输入的“自定义变量”。
REM 在纯DOS环境下,/p参数不存在,该语句自然不好使!
REM 可通过setx命令自行定义类似系统变量的变量(重新启动机器后仍然存在的那种变量),但XP系统中没有该命令,2003中有。格式:setx 变量  赋值
Set /a var=
REM 参数/a是让set命令参与算术运算
例:set /p input=请输入运算表达式
    set /a var=%input%
Echo %input%=%var%
例:set /a var= 1 "&" 1
     rem  别忘了加引号

变量中的替换语法 :%path:str1=str2%
例:set /a var+=1
Set %path:str1=str2%
REM 将字符串变量%PATH%中的str1替换为str2
变量的截取语法 :%a:~[m[,n]]%
方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)
例:@echo off
set var= zgk.com
Echo 显示var原值
echo %var%
pause
set a=%var: =%
Rem 原变量中的空格被替换掉
echo 显示替换后的var值
echo %a%
set b=%var:.=%
echo %b%
    rem 原变量中的点“.”被替换掉
pause
set还有以下扩展方法,%var:~a,b%
    注意:b不能为零;如a和b都为“负数”,a的绝对值一定要大于b的绝对值。
    REM  a为负数时,从变量var后端截取/保留a个字符赋值给新变量
REM  b为负数时,从变量var后端截掉/丢弃b个字符后,剩余部分赋值给新变量
REM  a为正数时,从变量var开头处截掉/丢弃a个字符后,剩余部分赋值给新变量
REM  b为正数时,从变量var开始截取处保留b个字符赋值给新变量

我下面有一个例子统一解释说明:
@echo off
set var=zgk.com
echo 变量var的值是:%var%
pause
set b=%var:~0,5%
rem %var:~0,5%:从头开始取前5个赋值给变量
echo 我认为的b=^%%var:^~0,5^%%结果是:zgk.c
echo 变量b的值是:%b%
pause
set c=%var:~1,5%
rem %var:~1,5%:从第2个开始取前5个赋值给变量
echo 我认为的c=^%%var:^~1,5^%%结果是:gk.co
echo 变量c的值是:%c%
pause
set e=%var:~0,-3%
rem %var:~0,-3%:截取最后3个,从头开始取到尾赋值给变量
echo 我认为的e=^%&var:^~0,-3^%%结果是:zgk.
echo 变量e的值是:%e%
pause
set f=%var:~1,-3%
rem %var:~1,-3%:截取最后3个,从第2个开始取到尾赋值给变量
echo 我认为的f=^%%var:^~1,-3^%%结果是:gk.
echo 变量f的值是:%f%
pause
echo 我认为的g=^%%var:^~3^%%结果是:.com
set g=%var:~3%
rem %var:~3%:从第4个开始取到尾赋值给变量
echo 变量g的值是:%g%
pause
set d=%var:~-3%
rem %var:~3%:只取后3个赋值给变量
echo 我认为的^d=^%%var:^~-3^%%结果是:com
echo 变量d的值是:%d%
pause

34.Smartdrv
设置磁盘高速缓存
35.Append
设置非可执行文件路径
例:当前目录里没有test.txt,c:\下有
append c:\ 类似于path命令
36.Debug
Debug 文件名
37.Diskcomp
比较两张软盘内容
38.Expand
解压命令
Expand 原压缩文件路径  目的地
39.Fc
比较两个文件内容
例:fc  /c   test1.txt   test2.txt
Rem  /c  不分大小写比较
40.Fasthelp
快速帮助
XP系统下没有
Fashhelp command 等价于 command/?
41.Qbasic
启动basic集成环境
42.Setver
设置版本,还能查看到winword和excel的版本
在config.sys中常用语法:device=setver.exe
REM
没在config.sys中加入device=setver时,还能看到winword和excel的版本,加上了它怎么就什么也看不到呢?也没有错误提示信息
REM
43.Share
44.Subst
用指定的路径替代某个盘符
例:subst  a:  c:\test 表示用C盘下的test目录替代A盘
Subst  a: /d 表示删除替代
45.Tree
显示当前目录或指定目录下的所有子目录结构,但并不显示文件名
/f  (file) :显示目录的同时还显示目录下的文件名
Tree /a :以ascii码显示目录树
例:查找c:\test目录下的test.txt的个数
tree  /f  c:\test | find /c /I  “test.txt”
如果文件太多超出缓冲区大小,可使用:tree /f |more
46.Vsafe
病毒防护程序,没试过!!!!!!!
47.Ver
查看DOS版本号
48.Vol
查看磁盘的卷标号
49.Ctty
改变控制的输入输出设备
例:ctty  aux 表示设置aux为输入输出设备
50.Recover
覆盖磁盘
51.Replace
例:replace  c:\test1.txt  d:\test2.txt  /r
即使test2.txt具有只读属性,也将被替换
例:replace d:\a.txt d:\backup /s /p /u
/s :用D:\a.txt替换D:\backup及其子目录下所有的同名文件
/p :替换前要进行确认
/u :(update),在替换前检查源文件与被替换的目标文件的修改时间,如果前者更新,则不进行替换
例:@echo off
cd %1
for %%i in (*.%3) do if not exist "%2%%i" copy %%i "%2" /y
replace *.%3 "%2" /u
执行filesyn.bat d:\ e:\ txt
52.at
定制计划任务(该命令定制的计划任务是后台运行的,而在Windows下“任务计划”定制的任务是前台运行),二者的主要区别还有at命令只能查看有at命令本身定制的计划任务,而控制面板中的“任务计划”可以查看它和at命令定制的任务;二者都依靠task scheduler服务,如果该服务停止,通过运行“任务计划”中的任务可以开启该服务,而at命令定制的服务则不行。
例:设置at制定的任务为前台运行
at  16:30  /interactive  c:\test.bat
/interactive 可使任务变为前台运行
例:指定时间运行某程序
At  16:00   c:\test.bat
::在16:00运行test.bat
例:没有15执行某任务
At  16:30 /every:15  c:\test.bat
::每月的15日16:30运行
At  16:30 /next:15   c:\test.bat
:: 下个月的15日16:30运行
At  16:30 /every:四  c:\test.bat
::每周四的16:30运行
例:删除某任务
At  2  /delete  /yes
::删除任务ID为2的计划任务,/yes表示删除任务不需要确认
例:删除所有任务
At  /delete
::不输入任何ID,表示清除所有计划任务

at 18:00 /every:M,T,W,Th,F,S,Su shutdown /r/f
53.shutdows
Shutdown  /s  /t  time  /f
/s  指定关机操作
/t  多长时间后关机,如/t  6,6秒钟后关机
/f  强制关机,不管还有什么程序在进行
例:在指定的计算机上运行某程序
At  \\computername  16:30  c:\test.bat
54.find
常和type命令结合使用。如:type 文件|find “str” .
标准格式    find  参数  “要查找的字符串”  待查找的文本文件
/v   :显示不包括“要查找的字符串”的文本的其它内容,就象“反选”功能
/c   :显示文本中“要查找的字符串”出现的次数
/n   :显示文本中“要查找的字符串”所在的行号及其内容
/I   :忽略大小写
例:在test.txt中查找nihao字符串
find  “nihao”  test.txt
Find  /c  “nihao”  test.txt
::/c(count) 统计nihao在test.txt出现的次数
Find  /n  “nihao”  test.txt
::/n(number) 统计所有nihao所在的行数
Find  /i  “nihao”  test.txt
::/i(ignore)忽略大小写
Find  /v  “nihao”  test.txt
::/v  查找不包含nihao字符串的内容
55.Shift
增加批处理中参数的数量。
新:更改批处理文件中可替换参数的位置。

Shift /2
将%3移到%2,将%4移到%3,依此类推,但并不影响%0和%1。
56.Systeminfo
如果需要批处理显示有关系统信息,该命令很有用。
57.Ntsd
强制关闭进程命令,例:ntsd –c q –pn notepad.exe
Rem  -c  q  :c是command;q是quit;p是PID
2008.10.30  新知
Ntsd.exe实际是个类似DEBUG的调试进程的程序,通过跟进程建立连接在做各种操作,当它退出同它所连接的进程就会关闭。
58.建立隐藏用户
查看默认用户:net user %username%
之前掌握注册表的用法:
1利用net新建用户;2导出注册表SAM下的name项;3删除新建用户;4导入已导出的注册表
新方法:net user zgktest$ /add,此时,用net user是无法查看到新建用户的;为新建用户添加注释:net user zgktest$ /comment:”注释内容”
59.Sfc
扫描受保护的系统文件的完整性
/scannow  :立即扫描所有受保护的系统文件,如有修改自动修复。
/verifyonly  :仅扫描不修复
/verifyfile  :仅扫描指定的文件不修复
59.Taskkill
终止进程
/f   强行终止
/im  指定终止进程的图象名
例:taskkill /f  /im  ctfmon.exe  /im  notepad.exe
2008-3-11
60.pushd  popd
cd /d  c:\test
rem 将当前目录更改为c:\test
Pushd  d:\test
Rem 保存当前目录c:\test,并将当前目录切换为d:\test
Popd
Rem 恢复保存的当前目录c:\test
61.Fsutil  (系统自带命令,一个我还不知道和了解的命令,2008-3-19)?????????
62.Set (第三方工具,一个我还不知道和了解的命令,2008-3-19)?????????
sed "N;s/\n/ => /" urfile
63.setacl(第三方工具,一个我还不知道和了解的命令,2008-3-19)?????????
学习网址:http://setacl.sourceforge.net/html/examples.html
64.cacls(系统自带命令,一个我还不知道和了解的命令,2008-3-19)?????????
65.msg  %username%  显示信息
显示指定用户%username%所发信心
三、批处理命令简介
1.Echo on/off
打开或关闭回显;显示信息
echo off 表示不显示它以后的所有命令行
其它几种用法:
Echo 显示信息
Echo y|format a: 表示传递参数y
Echo n|format a:
Echo abc>建立新文件
以下是echo输入空行特殊写法:Echo.;Echo+;Echo;Echo,;Echo:。
例:echo nihao
    @echo nihao
    Pause
执行结果:
    echo nihao   rem 显示第1行命令行本身
    nihao       rem 显示第1行命令行执行结果
    nihao       rem显示第2行命令行执行结果
2.@
不显示命令行本身
3.Call
在一个批处理文件中调用另一个批处理或文件
例:在1.bat中调用2.bat
1.bat
@echo off
Echo this is 1.bat
Call  2.bat
::此时,用command /c 2.bat代替call 2.bat,不行,如果1.bat或2.bat中有中文,则显示一堆乱码
::用start 2.bat代替call 2.bat,执行完毕根本不返回到1.bat。
Echo 2.bat end,back to 1.bat
4.Pause
按任意键暂停
5.Goto label 和:label连用
注意label的命名有讲究,如果批处理中有多个label,那么label名的前八位字母就不能完全一致,因为COMMAND只识别前八位,如果命名一致,从第2个label将永远不能执行。
6.Rem
注释,等同于 ::和/*  */
因为DOS将:后跟任何字母或数字都认作非法标识,所以 :+/:-等都可起到注释作用
7.%
参数表示符
参数是指运行批处理文件时在文件名后加的字符串,范围%0~%9,%0表示文件本身,字符串由%1~%9
%0用在不同的环境里,即可以返回“批处理文件所在的绝对路径”,又可以“执行批处理的死循环”。
例:不断提示“我爱你”并返回该批处理文件的绝对路径
@echo off
Echo 我爱你,杨海红!
Echo %0
%0
小技巧:添加行内注释
%注释内容%(可以用作行内注释,不能出现重定向符号和管道符号)
为什么这样呢?此时“注释内容”其实被当作变量,其值是空的,故只起注释作用,不过这种用法容易出现语法错误,一般不用。
8.If
条件判断语句
If  (not)  /i  “字符串1”=”字符串2” 待执行的命令
/I  :表示不区分大小写判断
例:@echo off
Set  /p var1=  please input
Set  /p var2=  please input
If   "%var1%"=="%var2%"  (echo 变量相等)  else echo 变量不相等
::变量var1和var2使用了双引号,是为了比较变量中的空格,如var1=a,var2=a ,不加
::双引号,它们相等,执行的是(echo 变量相等),加了双引号,执行的则是“else echo 变量不相等”命令
pause
If  (not) exist 文件 待执行的命令
ELSE 子句必须在 IF 之后出现在同一行上。例如:
IF EXIST filename (
        del filename
    ) ELSE (
        echo filename missing
    )

例:if exist c:\test1.txt   (echo 存在test1.txt)   else  echo  test1.txt不存在
If  (not) errorlevel 数字 待执行的命令
补充:这不是bug,而是 if errorlevel 语句的特点:当使用 if errorlevel 0 …… 的句式时,它的含义是:如果错误码的值大于或等于0的时候,将执行某个操作;当使用 if %errorlevel%==0 …… 的句式时,它的含义是:如果错误码的值等于0的时候,将执行某操作。因为这两种句式含义的差别,如果使用前一种句式的时候,错误码语句的排列顺序是从大到小排列
%ERRORLEVEL% 这是个系统变量,返回上条命令的执行结果代码! "成功"用0表示  "失败"用1表示. 当然还有其他参数,用的时候基本就这两数字.
一般上一条命令的执行结果代码只有两结果,"成功"用0表示  "失败"用1表示
  这只是一般的情况,实际上,errorlevel返回值可以在0~255之间,比如,xcopy默认的errorlevel值就有5个,分别表示5种执行状态:
例:@echo off
set /p var=随便输入个命令:
%var%
if %ERRORLEVEL% == 0  (
   echo !var! 执行成功了
   ) ELSE (
   echo 基本上执行失败了..
   )
pause
例:@echo off
Set /p  commandname=请输入要测试的是否存在命令
If  errorlever==0  (echo 命令成功执行)  else  echo 命令没有成功执行
::曾经错误errorlever和0之间忘记了= =,echo和显示的信息之间没有空格
pause
例: @echo off
if not exist d:\myfolder\nul md d:\myfolder
if not exist d:\myfolder\word\nul md d:\myfolder\word
REM 在win98系统中,if语句无法检测到目录的存在,但可以检测空设备,所以为保证脚本正常运行,使用了nul。
If  defined  xxx  command :判断xxx是否是被定义的变量
补:IF DEFINED variable command
     IF NOT "variable"=="" command
    上面两条命令效果一样,变量不为空,就表示该变量已经被定义defined。
请注意variable为不使用引导符号%的变量名,不能用写为%variable%,否则出错。
例:@echo off
Set  var=123
If defined var (echo var是被定义的变量)  else echo 未被定义
pause
If defined %var% (echo %var%是被定义的变量)  else echo %var%是未被定义
::对var的值进行判断是否为变量
pause
Set 123=456
If defined 123 (echo 123是被定义的变量)  else echo 未被定义
pause

9.Choice
Choice /c:参数 参数表示可输入的字符,由set /p代替,已经很少用
10.For
循环命令

FOR /D %%variable IN (set) DO command [command-parameters]

相关参数说明:
Skip :跳行
tokens :取列
Delims :分割符
/d (directory 目录的缩写) 仅对当前目录下的目录操作有效,对文件无效,如需要对子目录下的目录操作,可与参数 /r 配合使用。
如果Set包含通配符*或?,将对与set相匹配的每个目录执行指定的Command。
例:仅显示C盘下所有目录名称。
    for /d %%a in (c:\*) do @echo %%a
例:仅显示C盘下目录名称为3个字母的目录名称
    for /d %%a in (???) do @echo %%a
    rem 如果C盘下没有3个字母或数字的目录,在CMD下执行上面的命令行感觉没什么
Rem  效果,当然%%a得改成%a。
例:@echo off
for /d  /r %%i in (*) do @echo %%i
    ::列出当前目录中的所有未隐藏的目录,文件不操作
pause

FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
  1、set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。
  2、相反,如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录),而不管set中的指定文件是否存在。这与前面所说的单点(.)枚举目录树是一个道理,单点代表当前目录,也可视为一个文件。
例:
如果集仅为一个单点(.)字符,则枚举该目录树。
例:枚举C盘下所有目录包括子目录下所有.exe文件(对查毒特有用)。
    for /r c:\ %%a in (*.exe) do @echo %%a>>temp.txt
    rem 记住用>>不要用>啊!否则C盘就只有一个exe文件了。
例:枚举C盘含有boot.ini文件的所有目录(对查毒特有用)。
    for /r c:\ %%a in (boot.ini)  do @echo %%a
例:枚举c:\documents and setting目录的目录树。
    for /r c:\docume~1 %%a in (.) do @echo %%a
/r (road 路径的缩写)  递归(即对当前目录操作,其下的所有子目录也进行操作)
补:当用.作为循环范围时,for只将子目录的结构(目录名)作为循环范围,而不包括目录里面的文件。
例:for /r . %a in(.) do @if exist %a\txt @echo %a\txt
例:@echo off
for /d  /r  %%i in (*) do @echo %%i
    ::列出当前目录及其子目录中的所有未隐藏的目录,文件不操作
pause
例:for /r %%i in (test.txt) do echo %%i
    rem 遍历出所有存在test.txt文件的目录
例:对E盘下的music目录下的所有.mp3遍历,只显示文件名
for /r e:\music %a in (*.mp3) do @echo %~na
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
/l (ladder 阶梯的缩写)  迭代数值范围
例:一个可怕的批处理
    for /l %%i in (1,1,5) do @start cmd
例:@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %%variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %%variable IN ('command') DO command [command-parameters]
带引号的字符串"options"包括一个或多个指定不同解析选项的关键字。这些关键字为:
eol=c           - 指一个行注释字符的结尾(就一个)
skip=n          - 指在文件开始时忽略的行数。
delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
                          默认分隔符集。
tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                          的 for 本身。这会导致额外变量名称的分配。m-n
                          格式为一个范围。通过 nth 符号指定 mth。如果
                          符号字符串中的最后一个字符星号,
                          那么额外的变量将在最后一个符号解析之后
                          分配并接受行的保留文本。经测试,该参数最多
                          只能区分31个字段。
usebackq        - 使用后引号(键盘上数字1左面的那个键`)。未使用参数usebackq时:file-set表示文件,但不能含有空格 双引号表示字符串,即"string"单引号表示执行命令,即'command'使用参数usebackq时:file-set和"file-set"都表示文件
                          当文件路径或名称中有空格时,就可以用双引号括起来
                            单引号表示字符串,即'string'
                            后引号表示命令执行,即`command`
补:如果没有解析关键字,默认tokens=1,既读取第1列内容。
/f (file 文件的缩写)   读取文本中的每一行内容赋值给变量或将命令的执行结果返给变量(很常用)
例:for /f “tokens=2,3,4 delims=/ “ %a in (‘date /t’) do @echo %c-%a-%b
因delims(分割符)包括/和空格,因为这个空格,所有delims必须是/f选项的最后一项。
例:有一文本test.txt,内容为:
姓名     关系
    ;        显示对应关系
张仪     劳动
得     顾主
@echo off
for /f "eol=; tokens=1,2 delims= " %%a  in (c:\test.txt) do @echo %%a %%b
Pause
    ::读取文本的内容赋值给变量%%a,之后显示文本中的两列内容,带分号的行不显示
::eol=;表示忽略以分号;开头的行,即使不写该参数,也默认执行该参数
::eol=;表示以分号开始的行是注释行
::tokens=1,2表示打印/显示文本的第1,2列内容
::delims= 表示以空格为分隔符
::"delims=" 的含义是取消默认的分隔符,默认的分隔符包括:空格和制表键Tab。
Rem 如果没有+
例:@echo off
for /f "eol=; tokens=1,2 delims= " %%a in (‘net user’) do @echo  %%a  %%b
    ::对net user加单引号是把它当命令使,将结果返回给for命令
    ::delims=作用是“那个"delims=" 是为了让我空格的行能整行显示出来,不加就只显示空格左边一列”
~I  表示删除引号
    删除首尾的引号
删除开头的引号
尾部的和中间的引号不删除   
例:有一test.txt文档,内容如下:
“afds”
“daf
Dfs”
Afd”dfa
执行以下代码
    @echo off
for /f  %%a  in (c:\test.txt) do @echo %%~a
pause
结果如下:
    afds
daf
Dfs”
    Afd”dfa
%~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*使用
%~fi  表示将%i扩展到一个完全合格的路径
   例:@echo off
for /f  %%i  in ('dir /b')  do @echo %%~fi
rem %~fi的绝对路径显示出来,如果没有f,则仅显示文不含路径的文件名和目录名
pause
%~di  表示将%i 扩展到一个磁盘驱动器号
%~pi  表示将%i扩展到路径
%~ni  表示将%i扩展到文件名
%~xi  表示将%i扩展到文件后缀
%~si  表示将%i扩展到文件短名
例:@echo off
for /f  %%i  in ('dir /b')  do @echo %%~si
pause
如果根目录有documents and setting,则只显示documents这样形式的文件短名
%~ai  表示将%i扩展到文件属性
%~ti  表示将%i扩展到文件的大小和日期
%~zi  表示将%i扩展到文件的大小
%~$path:I   表示在指定的path下搜索指定的文件
例:@echo off
for /f "delims=" %%i  in ("ping.exe")  do @echo %%~$path:i
    ::曾经犯的错误,括号里使用双引号而不是单引号
pause
11.,
相当于空格
例:在CMD下执行dirc:会出现错误提示,使用dir,c:则不会
12. “  “
界定符,常用来界定“带空格的目录”
例:在CMD下执行dir c:\documents and setting会出现错误提示,使用dir “c:\document and setting”则不会
Cd “c:\documents and setting”
Cd c:\docume~1
Cd c:\doc*               
Rem 它们效果是一样的
13. ^
转义字符,取消特殊符号的作用
例:如果想将>这个特殊符号写到文本文件中去
echo > >test.txt 错误
Echo ^> >test.txt正确,取消了>特殊符号的输出重定向功能
还有“续行功能”功能
@echo off
echo 英雄^
是^
好^
男人
Pause
因为^将每行后的看不到的“回车符”转义了,“回车符”起不到回车作用,自然就“不换行”了。
Rem  执行结果是:英雄是好男人,就是连成一行意思
14.        &
命令连接字符,不管&之前的命令执行正确与否,其后的命令都会顺序执行
15.        &&
命令连接字符,只有&&之前的命令执行正确,其后的命令才会执行
16.        ||
命令连接字符,只有||之前的命令执行错误,其后的命令才会执行
17.        |
管道命令
把前一个命令的输出结果作为下一个命令的输入
18.        >
输出重定向命令
把前一个命令的输出结果写到后面的设备中去,后面设备的内容被覆盖
19.        >>
输出重定向命令
把前一个命令的输出结果写到后面的设备中去,后面设备的内容不被覆盖
20.        <
输出重定向命令
把后一个设备的指定内容作为前一个设备的输入
@echo off
set /p str=<%0
echo %str%
pause
运行显示批处理文件自身的第一行:@echo off
21.        *和?
通配符
*表示任意多个字符
?表示任意一个字符
其它特殊符号:
     CR(0D) 命令行结束符
        Escape(1B) ANSI转义字符引导符
        Space(20) 常用的参数界定符
        Tab(09) ; = 不常用的参数界定符
        + COPY命令文件连接符
        * ? 文件通配符
        / 参数开关引导符
        : 批处理标签引导符
22.        概念理解:变量扩展与延迟变量扩展
变量扩展:在批处理的执行中,用变量的值替换变量的名的过程。
延迟变量扩展(使用标志setlocal enabledelayedexpansion)
延迟变量必须用 !! 括起来
例:@echo off
for /l  %%i  in (1,1,5) do (
set var=%%i
echo %var%
)
Pause
::代码解读,该代码段的执行结果显示“5个echo处于关闭状态”
          ::为什么呢?
          ::因为CMD执行批处理时首先是将每一个命令行读入内存进行匹配
::匹配的含义是检查命令行是否有语句格式的错误,而不是执行命令行
::红色代码是一行命令行
::变量var首先进行匹配而不能执行,所以此时var还没有被赋值,是空值
        例:@echo off
setlocal enabledelayedexpansion
for /l  %%i  in (1,1,5) do (
            set var=%%i
            echo !var!
             )
Pause
            ::代码解读,该代码段的执行结果显示“数列形式的1 2 3 4 5”
            ::为什么该代码段执行正确?
            ::因为它使用了“延迟环境变量扩展”
            ::延迟环境变量扩展中的变量用“! !”而不是“% %”
            ::使用延迟环境变量扩展的目的是先执行1次命令行在进行匹配
            ::因此,变量var先被赋值为1,之后匹配命令行
同理:
            set  var=test & echo %var% 会出现错误提示:echo处于关闭状态
            setlocal enabledelayedexpansion
            set  var=test & echo !var!    被正确执行
例:@echo off
setlocal enabledelayedexpansion
set a=4
set a=5 & echo !a!
pause
结果:5
rem 动态中感知即在运行过程中赋值
(新解:
16、setlocal 与 变量延迟
本条内容引用[英雄出品]的批处理教程:
要想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看。
为了更好的说明问题,我们先引入一个例子。
例1:
@echo off
set a=4
set a=5 & echo %a%
pause
结果:4
解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?
让我们先了解一下批处理运行命令的机制:
批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。我们现在分析一下例1,批处理在运行到这句“set a=5 & echo %a%”之前,先把这一句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!(没有为什么,批处理就是这样做的。)
而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。
那么如何开启变量延迟呢?变量延迟又需要注意什么呢?举个例子说明一下:
例2:
@echo off
setlocal enabledelayedexpansion
set a=4
set a=5 & echo !a!
pause
结果:5
解说:启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。
分析一下例2,首先“setlocal enabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量a赋值为
4,“set a=5 & echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。
再举一个例子巩固一下。
例3:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!
)
pause
结果:
1
2
3
4
5
解说:本例开启了变量延迟并用“!!”将变量扩起来,因此得到我们预期的结果。如果不用变量延迟会出现什
么结果呢?结果是这样的:
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
即没有感知到for语句中的动态变化。
提示:在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。这一点也可以加以利用,看例子。
例:交换两个变量的值,且不用中间变量
@echo off
::目的:交换两个变量的值,但是不使用临时变量
::Code by JM 2007-1-24 CMD@XP
::出处:http://www.cn-dos.net/forum/viewthread.php?tid=27078
set var1=abc
set var2=123
echo 交换前: var1=%var1% var2=%var2%
set var1=%var2%& set var2=%var1%
echo 交换后: var1=%var1% var2=%var2%
pause

23.;
当命令相同时,可以将不同目标分隔开
例:dir c:\;d:\;e:\相当于dir c:\  dir d:\ dir e:\
补充:
autoexec.bat :开机时自动运行的批处理文件。
winstart.bat :选择进入windows状态时自动运行的批处理文件。
Dosstart.bat :在windows下重新启动进入MS-DOS时自动运行的批处理文件。
区别:执行的时间段不同。
C:\WINDOWS\SoftwareDistribution\Download:是自动更新文件下载存储的位置,如果空间不足,可以删掉。
$KBXXX$文件:如果不需要卸载以下载的更新文件,可以删掉它们。
C:\WINDOWS\system32\dllcache:该目录下的文件不要删除,因为如果发生病毒修改系统文件,系统会通过“系统文件受保护”功能从该目录下恢复同名系统文件。
24.Goto和:
:后紧跟字母和数字,:被认为“标号”。
:后跟非字母和数字,:被认为“注释”。
25 .start
启动外部程序,如果需要外部程序执行完毕再运行下一行命令使用参数/w。
Start /w explorer.exe d: 。
26.assoc和ftype
Assoc设置“文件扩展名”关联,关联到“文件类型”。
Ftype设置“文件类型”关联,关联到“执行程序和参数”。
27.( )
例:
命令:echo 1 & echo 2 & echo 3
可以写成:
(
echo 1
echo 2
echo 3
)
28.子程序的理解
在批处理程序中可以调用外部可运行程序,比如exe程序,也可调用其他批处理程序,这些也可以看作子
程序,但是不够方便,如果被调用的程序很多,就显得不够简明了,很繁琐。
在windowsXP中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序
后面。
子程序调用格式:
  CALL :label arguments
子程序语法:
  :label
  command1
  command2
  ......
  commandn
  goto :eof
在子程序段中,参数%0指标签:label
子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。
子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。
传至子程序的参数在call语句中指定,在子程序中用%1、%2至%9的形式调用,而子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量,请看下面的例子。
子程序例1:
@echo off
call :sub return 你好
echo 子程序返回值:%return%
pause
:sub
set %1=%2
goto :eof
运行结果:你好
子程序例2:设计一个求多个整数相加的子程序
@echo off
set sum=0
call :sub sum 10 20 35
echo 数据求和结果:%sum%
pause
:sub
rem 参数1为返回变量名称
set /a %1=%1+%2
shift /2
if not "%2"=="" goto sub
goto :eof
运行结果:65
29.调用VbScript脚本程序
使用 Windows 脚本宿主,可以在命令提示符下运行脚本。CScript.exe 提供了用于设置脚本属性的命令行开关。
用法:CScript 脚本名称 [脚本选项...] [脚本参数...]
选项:
//B         批模式:不显示脚本错误及提示信息
//D         启用 Active Debugging
//E:engine  使用执行脚本的引擎
//H:CScript 将默认的脚本宿主改为 CScript.exe
//H:WScript 将默认的脚本宿主改为 WScript.exe (默认)
//I         交互模式(默认,与 //B 相对)
//Job:xxxx  执行一个 WSF 工作
//Logo      显示徽标(默认)
//Nologo    不显示徽标:执行时不显示标志
//S         为该用户保存当前命令行选项
//T:nn      超时设定秒:允许脚本运行的最长时间
//X         在调试器中执行脚本
//U         用 Unicode 表示来自控制台的重定向 I/O
“脚本名称”是带有扩展名和必需的路径信息的脚本文件名称,如d:\admin\vbscripts\chart.vbs。
“脚本选项和参数”将传递给脚本。脚本参数前面有一个斜杠 (/)。每个参数都是可选的;但不能在未指定脚本名称的情况下指定脚本选项。如果未指定参数,则 CScript 将显示 CScript 语法和有效的宿主参数。
30.时间延迟
本条参考引用[英雄]教程
什么是时间延迟?顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。
延迟的应用见下节:“模拟进度条”。
1、利用ping命令延时
例:
  @echo off
  echo 延时前:%time%
  ping /n 3 127.0.0.1 >nul
  echo 延时后:%time%
  pause
解说:用到了ping命令的“/n”参数,表示要发送多少次请求到指定的ip。本例中要发送3次请求到本机的ip(127.0.0.1)。127.0.0.1可简写为127.1。“>nul”就是屏蔽掉ping命令所显示的内容。
2、利用for命令延时
例:
  @echo off
  echo 延时前:%time%
  for /l %%i in (1,1,5000) do echo %%i>nul
  echo 延时后:%time%
  pause
解说:原理很简单,就是利用一个计次循环并屏蔽它所显示的内容来达到延时的目的。
3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内
例:
    @echo off
    echo %time%
    call :delay 5000
    echo %time%
    pause
    exit
:delay
    echo WScript.Sleep %1>delay.vbs
    CScript //B delay.vbs
    del delay.vbs
    goto :eof
运行显示:
10:44:06.45
10:44:11.95
请按任意键继续. . .
上面的运行结果显示实际延时了5500毫秒,多出来的500毫秒时建立和删除临时文件所耗费的时间。误差在一秒之内。
4、仅用批处理命令实现任意时间延迟,精确度10毫秒,误差50毫秒内
仅用批处理命令就可以实现延迟操作。
例:
@echo off
set /p delay=请输入需延迟的毫秒数:
set TotalTime=0
set NowTime=%time%
::读取起始时间,时间格式为:13:01:05.95
echo 程序开始时间:%NowTime%
:delay_continue
set /a minute1=1%NowTime:~3,2%-100
::读取起始时间的分钟数
set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
::将起始时间的秒数转为毫秒
set NowTime=%time%
set /a minute2=1%NowTime:~3,2%-100
:: 读取现在时间的分钟数
set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
::将现在时间的秒数转为毫秒
set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
if %TotalTime% lss %delay% goto delay_continue
echo 程序结束时间:%time%
echo 设定延迟时间:%delay%毫秒
echo 实际延迟时间:%TotalTime%毫秒
pause
运行显示:
   请输入需延迟的毫秒数:6000
   程序开始时间:15:32:16.37
   程序结束时间:15:32:22.37
   设定延迟时间:6000毫秒
   实际延迟时间:6000毫秒
   请按任意键继续. . .
实现原理:首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。
误差:windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。
      经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒。
为了方便引用,可将上面的例子改为子程序调用形式:
@echo off
echo 程序开始时间:%Time%
call :delay 10
echo 实际延迟时间:%totaltime%毫秒
echo 程序结束时间:%time%
pause
exit
::-----------以下为延时子程序--------------------
:delay
@echo off
if "%1"=="" goto :eof
set DelayTime=%1
set TotalTime=0
set NowTime=%time%
::读取起始时间,时间格式为:13:01:05.95
:delay_continue
set /a minute1=1%NowTime:~3,2%-100
set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
set NowTime=%time%
set /a minute2=1%NowTime:~3,2%-100
set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
if %TotalTime% lss %DelayTime% goto delay_continue
goto :eof
31。模拟进度条
下面给出一个模拟进度条的程序。如果将它运用在你自己的程序中,可以使你的程序更漂亮。
@echo off
mode con cols=113 lines=15 &color 9f
cls
echo.
echo  程序正在初始化. . .
echo.
echo  ┌──────────────────────────────────────┐
set/p=  ■<nul
rem 设置输入小黑框的“启始点”
for /L %%i in (1 1 38) do set /p a=■<nul&ping /n 1 127.0.0.1>nul
rem 实际是在不换行的情况下输入了39个小黑框
echo 100%%
echo  └──────────────────────────────────────┘
pause
解说:“set /p a=■<nul”的意思是:只显示提示信息“■”且不换行,也不需手工输入任何信息,这样可以使每个“■”在同一行逐个输出。“ping /n 0 127.1>nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。

四、技巧集合
1.*.*可用.代替
Del *.*  equ  del .
2.无论命令是否正确执行,都屏蔽它的显示信息可将命令重定向到空设备NUL上
例:dir >nul 2>nul
3.向文本中添加内容
Type con >>文本名      REM  已测试,按F6键或CTRL+Z停止输入
Type con >filename   equ    copy con filename
type nul>filename 表示将文件内容清空,但filename的属性不能是只读和隐藏文件
4.DOS下的指法练习
Copy con nul
5.Regedit /e
导出注册表,例:regedit /e test,将注册表数据库导出到文件test.reg中
导入注册表,例:regedit/c test.reg,将test.reg导入到注册表中
            例:regedit test.dat,将test.dat导入到注册表中
6.在“运行”或CMD下,直接运行“hh ntcmds.chm”,会启动“命令行参考”窗口,方便自学DOS命令
7.2>nul
2表示错误消息句柄
8.让程序一个接一个执行
start  /w  第一个程序
start 第二个程序
9.查看与本地机器连接的用户列表
Net  session
清除已经与本地连接的用户temp
Net session \\temp  /delete
10.在子网内,ping不通网关,但可以与其它机器正常ping通
解决思路:获得网关正确的MAC地址,之后执行
arp  -a   网关IP  网关MAC地址
11.新建一个文件
type nul>new.txt
    例:建立批处理文件的方法总结
a. type nul>test.bat (test.bat空内容,需要进入编辑内容)
    b. copy con test.bat
c. echo dir c:>test.bat
  echo dir d:>>test.bat
d. edit test.bat
  edlin test.bat
e. 在Windows下建立文本文件再改扩展名(需要进入编辑内容)
12.命令提示符被禁止
解决思路:reg delete HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows /f >nul
13.批处理执行遇到“bad command or filename”这样的错误提示该如何理解?
命令错误;
命令正确,但不在当前目录和PATH设置的搜索路径内;
批处理文件内容中有COMMAND无法解释的字符。
14.在用批处理编写菜单时,不要用特殊符号,如:| ,会引起歧义,造成错误。
15.想同别人QQ,可借鉴如下代码:Set/p qq=请输入你想和他/她聊的QQ号码(然后回车):
start tencent://Message/?Uin=%qq%
16.如何在批处理中加空行
@echo off
echo  first^

echo  second
rem ^是转义字符,可以将空行转义,其实自己也不太懂,但这个方法可行?
17.批处理中如何调用vbs文件(未测试)
start "" a.vbs   或   start   c:\a.vbs
批处理中如何安装inf文件(在“工具”“文件夹选项”“文件类型”高级下查看“编辑”获取相关内容)
rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 c:\b.inf
18.如果用Cacls把硬盘锁定了的解决方法
Cacls D: /t /c /g dfdgdfghfh:f    rem  解锁D盘
19.设置本机“用户帐户”操作
control userpasswords2
20.自动将某个类型的文件名导入到某个文件中
    wmic datafile where "Extension='mp3'" get name>aaa.TXT
21.建立一个删除文件的批处理文件,其内容为(拖动要删除的文件到该文件图标即可):
rem 以下是自己思考测试获得
rem ::for /f "delims=" %%a in ('dir/ad/s/b^|findstr /e "\."') do echo %%a
rem for %%i in (%*) do  del "c:\%%~nxi" /f /s /q /a
五、断章取义
1.@echo msgbox "下载完了",4096 >> e:\test.vbs
start e:\test.vbs
REM 4096的含义是:系统模式:在用户响应消息框前,所有应用程序都被挂起
2.在批处理中加弹出窗口
a、Msg %username% /time:5 “hello,zgk”
REM 需TermService服务支持;/time:5表示弹出窗口停留时间;“hello,zgk”表示弹出窗口的内容。
b、net send %computername% “弹出窗口显示内容” >nul
REM 需message信使服务支持
c、利用系统自带的mshta程序
利用vbscript自带的msgbox函数显示
mshta vbscrip:msgbox(“弹出窗口具体内容显示”,64,”弹出窗口标题”)(windows.close)
REM 64表示弹出窗口停留时间,windows.close表示停留64秒后关闭窗口
d、利用vbscript的popup功能
   mshta vbscript:CreateObject("Wscript.Shell").popup("窗口显示内容",7,"窗口标题",64)(window.close)
e、mshta javascript:window.alert("警告窗口信息");window.close()
f、利用javascript的popup功能
mshta "javascript:new ActiveXObject('WScript.Shell').popup('Hello,lxmxn',7,'batch script',64);window.close();"
g、利用javascript的confirm功能
mshta javascript:confirm("ha");window.close()
3、不断弹出窗口的代码
@echo off
Start  notepad.exe
%0
Rem  试了一下,确实挺狠,只有重新启动机器
4、设定循环次数启动某程序或命令
@echo off
:loop
If not exist c:\test.txt echo. >c:\test.txt &goto err1
If not exist c:\test1.txt echo. >c:\test1.txt &goto err1
If not exist c:\test2.txt echo. >c:\test2.txt &goto err1
If not exist c:\test3.txt echo. >c:\test3.txt &goto err1
:err1
Start notepad.exe
Goto loop
Rem 其实还可以用其它方法实现,只为学习!
5、记录登陆计算机时间的批处理
@echo off
Date /t >record.txt
Time /t >>record.txt
Attrib +s +h record.txt
Attrib +s +h record.bat
最后,把record.bat加入到注册表中的如下位置:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
"Userinit"="C:\\WINDOWS\\system32\\userinit.exe,record.bat,"
注意:根据record.bat的实际路径书写,记住,它后面的逗号,不能不写!
9、隐藏运行批处理文件时“一闪而过的CMD窗口画面”
方法一:利用JS代码
new ActiveXObject('WScript.Shell').Run('cmd /c 隐藏的.bat',0);
方法二:利用VB代码
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c felix.bat",vbhide
方法三:利用VB代码
CreateObject("WScript.Shell").Run "cmd /c felix.bat",0
10、将某个文件拷贝到某个磁盘所有目录包括子目录下
@echo off
for /r D: %%i in (.) do copy /y 01.txt "%%i"
pause
REM 将01.txt拷贝到D盘下的所有目录
11、如何更干净的清除垃圾文件
关注 cookies、temp、tempor~1、history等目录和win386.swp和注册表信息
12、安静模式运行程序的脚本代码
    On Error Resume Next
set wshshell=createobject("wscript.shell")
a=wshshell.run ("文件名",0)
rem 其中的文件名就是要运行的程序,0就是程序运行时不显示运行窗口
13、删除found.001/found.002等垃圾文件的批处理代码,不错!
    for %%a in (c d e f g) do (
       for /r %%a:\ %%i in (FOUND.00*) do (rd /s /q %%i >nul 2>nul)
     )
14、清除重复行批处理代码
    @echo off
for /f "delims=" %%i in (a.txt) do (
        findstr /c:"%%i" b.txt 2>nul||echo %%i>>b.txt
)
Pause
    rem 为何能实现?
    rem 比如a.txt内容为“张三 李四 张三”三行,那么在将张三赋给变量%%i,后
    rem 再执行在b.txt中查找“张三”,没有找到说明第2行语句前半段错误,所以
    rem ||后的命令得以执行,那么第2次将“张三”赋给%%i再在b.txt中查找张三
Rem 就能够查到,语句正确,后者命令就不能执行,不知解释的是否正确
17、通过批处理修改注册表中的文件类型进而实现“某类型文件无法被打开”?
    @echo off
   reg add HKCR\.bat /f /ve /d bat >nul 2>nul
   reg add HKCR\.cmd /f /ve /d cmd >nul 2>nul
   echo.
   echo 啊哦,bat/cmd文件无法打开或者编辑了!
   pause >nul
   Rem bat和cmd后缀类型的文件就无法被打开了,如果需要打开它们可恢复注册表,rem 当然前提是有注册表备份了
六、概念理解
1.什么是MD5:MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),它能将一串随机长度的信息(当然也包括文件)通过其加密函数算法生成一个惟一的128位值,相同信息的MD5值也是相同的,反之,文件即使略有改动,其MD5值也会产生变化。因此,只需比较文件的MD5值,就能知道文件是否经过改动了。
七、DEBUG的学习
H
   :代表十六进制,DEBUG使用的是H,通过DEBUG可以建立工具用于批处理的使用。
学习示例:
在CMD下建立一“打印屏幕内容的工具”
Debug  scrprint.com
rem scrprint.com是即将要建立程序或者说是工具
-a 100
rem –是debug的输入标志, “a 100”表示在以十六进制地址100所指定的地址输入命令
0b06:0100  100 int 5
rem 输入命令int 5,“int 5”表示将打印屏幕内容
0b06:0102   mov ah,4c
0b06:0104   int 21
rem  以上两条命令是表示通知MS-DOS,结束程序
0106   按ENTER
-r cx
rem cx是Debug用来存放程序大小的寄存器
:6
rem 6是该程序的大小,计算程序大小的方法是最后一行地址0106减去第一行地址0100,是6个字节
-w
rem 将程序写入到磁盘中
-q
   Rem 退出MS-DOS
八.运算符学习
1.一元运算符
  ~   :取相反数(我还没理解)
  要点:取反先要计算二进制的补码后再取反。
  例:~-1
      负数的补码计算是其对应的正数“取反加1”
       00000001取反加1后是11111111
      在取反是0
例:~5
      正数的补码是其对应的二进制数
      
!   :取非
  例:![非0正数]为0
     ![0]为1
      Set /a  a=!2           rem  结果为0
      Set /a  a=!0           rem  结果为1
-   :去负数
  例: set /a  a=- =-(-2147483648)     rem  结果为=-2147483648,而非
       2147483648,这是因为2147483648已溢出
2.算术运算符
+   :加法
-    :减法
*    :乘法
/    :除法法
%   :取余       rem  %是在CMD下使用,如果在批处理文件中则使用%%
3.逻辑移位
<<  :逻辑左移
>>  :逻辑又移
       注意:在CMD或Bat中,需要用” ”或用转移符^对<和>转义
例:set /a  [x]”<<”[y]    rem  对x的二进制数“左移”y位
set /a a=15"<<"1(from cn-dos.net)
%a%就等于30
这是因为:15=bin(00 00000 00000 00000 00000 00000 01111)
左移1位就成了bin(0 00000 00000 00000 00000 00000 011110)
而bin(0 00000 00000 00000 00000 00000 011110)=2^4+2^3+2^2+2^1=30
4.逻辑  ^  |  &
^  :逻辑 "异"
|   : 逻辑"或"
&   : 逻辑"与"
注意在批处理中或命令行下要在运算符前加上^
这里的:                ^            |             &    对应于
离散数学上的: 异或⊕     析取∨     合取∧
规则: 合取∧(有0则0)  析取∨ (有1则1) 异或⊕ (同0反1)
例:set /a a=15^^5(from cn-dos.net)
%a%就等于10
这是因为:
     01111
⊕) 00101
─────
=)  01010
而bin(01010)=10
5.赋值运算符
=
例:set /a  a=+2    等价于    set /a  a=a+2
6.表达式分隔符
Set  a=2,b=3,c=4

   此帖被 +1 点积分    点击查看详情   
评分人:【 newsuper 分数: +1  时间:2008-10-30 21:16


2008-10-30 10:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tireless
银牌会员





积分 2025
发帖 1122
注册 2007-9-5
状态 离线
『第 2 楼』:  

看了一半,没耐心看下去了...纠正一些我认为的错误与笔误:

  Quote:
9.Md与Rd
新建目录
例:同时建立多个目录
md c:\1  d:\2  e:\3 等价于md c:\1;d:\2
删除目录,所删除的目录里不能有子目录和文件,如果想这样执行,可使用
Rd /s

应该是: rd "路径"。

  Quote:
例:建立一个加密目录及如何查看和删除它
md  test..\
Rem \的作用就是告诉系统建立文件夹时保留前面的两个..
Rem 实际建立的文件夹是test.,因为后面那个点.被当作“文件基本名和后缀的分隔符”了
这样就建立了一个“加密”的文件夹,双击无法打开它
可通过“开始”菜单中的“运行”或“资源管理器中的地址栏”输入它的“完整路径”查看
通过 rd /s /q删除它

我觉得实际建立的是 test..,要不怎么在“运行”对话框中输入 \test.. 能打开,输入 \test. 打不开?

  Quote:
54.find
Find  /c  “nihao”  test.txt
::/c(count) 统计nihao在test.txt出现的次数

应该是:
  /C        仅显示包含字符串的行数


  Quote:
三、批处理命令简介
... ...
8.If
补:IF DEFINED variable command
     IF NOT "variable"=="" command
    上面两条命令效果一样,变量不为空,就表示该变量已经被定义defined。
请注意variable为不使用引导符号%的变量名,不能用写为%variable%,否则出错。

要加上 % 才对。

  Quote:
10.For
例:枚举C盘含有boot.ini文件的所有目录(对查毒特有用)。
    for /r c:\ %%a in (boot.ini)  do @echo %%a

for /r 只是枚举目录树,然后指向 for 语句,并没有查找的功能,除非匹配通配符。上面的需要加上 if exist 进行判断。

  Quote:
/r (road 路径的缩写)  递归(即对当前目录操作,其下的所有子目录也进行操作)

"road" 好像没有“递归”的意思...for 的英文帮助:
Walks the directory tree rooted at [drive:]path


   此帖被 +4 点积分     点击查看详情   
评分人:【 HAT 分数: +4  时间:2008-10-30 17:57


2008-10-30 14:39
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tempuser
高级用户





积分 547
发帖 261
注册 2006-4-15
状态 离线
『第 3 楼』:  

谢谢指正学习中的偏差!

2008-10-30 17:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: