Board logo

标题: 学习笔记 [打印本页]

作者: tempuser     时间: 2008-10-30 10:32    标题: 学习笔记

曾经发过,但有点变化,希望我们初学者继续努力,共勉前进,也感谢所有帮助我们的人,谢谢! 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)????????? 学习网址:setacl.sourceforge.net ... 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 ::出处:www.cn-dos.net/forum ... 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

作者: tireless     时间: 2008-10-30 14:39
看了一半,没耐心看下去了...纠正一些我认为的错误与笔误:
9.Md与Rd 新建目录 例:同时建立多个目录 md c:\1 d:\2 e:\3 等价于md c:\1;d:\2 删除目录,所删除的目录里不能有子目录和文件,如果想这样执行,可使用 Rd /s
应该是: rd "路径"。
例:建立一个加密目录及如何查看和删除它 md test..\ Rem \的作用就是告诉系统建立文件夹时保留前面的两个.. Rem 实际建立的文件夹是test.,因为后面那个点.被当作“文件基本名和后缀的分隔符”了 这样就建立了一个“加密”的文件夹,双击无法打开它 可通过“开始”菜单中的“运行”或“资源管理器中的地址栏”输入它的“完整路径”查看 通过 rd /s /q删除它
我觉得实际建立的是 test..,要不怎么在“运行”对话框中输入 \test.. 能打开,输入 \test. 打不开?
54.find Find /c “nihao” test.txt ::/c(count) 统计nihao在test.txt出现的次数
应该是: /C 仅显示包含字符串的行数
三、批处理命令简介 ... ... 8.If 补:IF DEFINED variable command IF NOT "variable"=="" command 上面两条命令效果一样,变量不为空,就表示该变量已经被定义defined。 请注意variable为不使用引导符号%的变量名,不能用写为%variable%,否则出错。
要加上 % 才对。
10.For 例:枚举C盘含有boot.ini文件的所有目录(对查毒特有用)。 for /r c:\ %%a in (boot.ini) do @echo %%a
for /r 只是枚举目录树,然后指向 for 语句,并没有查找的功能,除非匹配通配符。上面的需要加上 if exist 进行判断。
/r (road 路径的缩写) 递归(即对当前目录操作,其下的所有子目录也进行操作)
"road" 好像没有“递归”的意思...for 的英文帮助: Walks the directory tree rooted at [drive:]path

作者: tempuser     时间: 2008-10-30 17:07
谢谢指正学习中的偏差!