9.Choice
Choice /c:参数 参数表示可输入的字符,由set /p代替,已经很少用
10.For
循环命令
FOR [%%f] in (集合) DO [命令]
/d 仅对目录操作有效,对文件无效
例:@echo off
for /d /r %%i in (*) do @echo %%i
::列出当前目录中的所有未隐藏的目录,文件不操作
pause
/r 递归(即对当前目录操作,其下的所有子目录也进行操作)
例:@echo off
for /d /r %%i in (*) do @echo %%i
::列出当前目录及其子目录中的所有未隐藏的目录,文件不操作
pause
/l 迭代数值范围
例:@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
/f 读取文本中的每一行内容赋值给变量或将命令的执行结果返给变量(很常用)
例:有一文本test.txt,内容为:
姓名 关系
; 显示对应关系
张仪 劳动
得 顾主
@echo off
for /f "eol=; tokens=1,2 delims= " %%a in (c:\test.txt) do @echo %%a %%b
::读取文本的内容赋值给变量%%a,之后显示文本中的两列内容,带分号的行不显示
::eol=;表示忽略以分号;开头的行,即使不写该参数,也默认执行该参数
::tokens=1,2表示打印/显示文本的第1,2列内容
::delims= 表示以空格为分隔符
Pause
例:@echo off
for /f "eol=; tokens=1,2 delims= " %%a in (‘net user’) do @echo %%a %%b
~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
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”则不会
13. ^
转义字符,取消特殊符号的作用
例:如果想将>这个特殊符号写到文本文件中去
echo > >test.txt 错误
Echo ^> >test.txt正确,取消了>特殊符号的输出重定向功能
14. &
命令连接字符,不管&之前的命令执行正确与否,其后的命令都会顺序执行
15. &&
命令连接字符,只有&&之前的命令执行正确,其后的命令才会执行
16. ||
命令连接字符,只有||之前的命令执行错误,其后的命令才会执行
17. |
管道命令
把前一个命令的输出结果作为下一个命令的输入
18. >
输出重定向命令
把前一个命令的输出结果写到后面的设备中去,后面设备的内容被覆盖
19. >>
输出重定向命令
把前一个命令的输出结果写到后面的设备中去,后面设备的内容不被覆盖
20. <
输出重定向命令
把后一个设备的指定内容作为前一个设备的输入
21. *和?
通配符
*表示任意多个字符
?表示任意一个字符
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! 被正确执行
23.;
当命令相同时,可以将不同目标分隔开
例:dir c:\;d:\;e:\相当于dir c:\ dir d:\ dir e:\
补充:
autoexec.bat :开机时自动运行的批处理文件
winstart.bat :选择进入windows状态时自动运行的批处理文件
Dosstart.bat :在windows下重新启动进入MS-DOS时自动运行的批处理文件
区别:执行的时间段不同
四、技巧集合
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
五、断章取义
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