进来学习批出理积累了一些经验,与大家共同分享!!希望游客在发现错误的时候及时提醒!!谢谢!!

 
1、REM 和 ::或:+
REM为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显。
注意:
第一, 任何以冒号:开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。 有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。 无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。
第二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中。 
 
2、ECHO 和 @
@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。
echo命令的作用列举如下:
(1)打开回显或关闭回显功能 格式:echo [{ on|off }]
如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”。
(2)显示当前ECHO设置状态 格式:echo
(3)输出提示信息       格式:ECHO 信息内容
(4)关闭DOS命令提示符 在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。
(5)输出空行,即相当于输入一个回车     格式:ECHO.
注意:
第一,命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。
第二,“.”可以用,:;”/[\]+等任一符号替代。
第三,命令ECHO.输出的回车,如echo.|time即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态
(6)答复命令中的提问
格式:ECHO 答复语|命令文件名
上述格式可以用于简化一些需要人机对话的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,它是通过DOS管道命令把ECHO命令输出的预置答复语作为人机对话命令的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车:
C:>ECHO Y|DEL A :*.*
(7)建立新文件或增加文件内容
格式:ECHO 文件内容>文件名 
(8)向打印机输出打印内容或打印控制码
格式:ECHO 打印机控制码>PRN
(9)使喇叭鸣响
C:>ECHO ^G
“^G”是在dos窗口中用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。使用方法是直接将其加入批处理文件中或做成批处理文件调用。 这里的“^G”属于特殊符号的使用,请看本文后面的章节
 
3、PAUSE
PAUSE,玩游戏的人都知道,暂停的意思 在这里就是停止系统命令的执行并显示下面的内容。
例: PAUSE 运行显示: 请按任意键继续. . .
要显示其他提示语,可以这样用: Echo 其他提示语 & pause > nul
 
4、errorlevel 
程序返回码 echo %errorlevel% 每个命令运行结束,可以用这个命令行格式查看返回码 用于判断刚才的命令是否执行成功 默认值为0,一般命令执行出错会设 errorlevel 为1
 
5、title 
设置cmd窗口的标题 title 新标题 #可以看到cmd窗口的标题栏变了
 
6、COLOR 
设置默认的控制台前景和背景颜色。
COLOR [attr]
attr 指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为 前景。每个数字可以为以下任何值之一:
0 = 黑色 8 = 灰色 1 = 蓝色 9 = 淡蓝色 2 = 绿色 A = 淡绿色 3 = 湖蓝色 B = 淡浅绿色 4 = 红色 C = 淡红色 5 = 紫色 D = 淡紫色
6 = ××× E = 淡××× 7 = 白色 F = 亮白色
如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时 的颜色。这个值来自当前控制台窗口、/T 开关或 DefaultColor 注册表值。
如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令 会将 ERRORLEVEL 设置为 1。
例如: "COLOR fc" 在亮白色上产生亮红色
 
7、mode 
配置系统设备
串行口: MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s] [to=on|off] [xon=on|off] [odsr=on|off] [octs=on|off] [dtr=on|off|hs] [rts=on|off|hs|tg] [idsr=on|off]
设备状态: MODE [device] [/STATUS]
打印重定向: MODE LPTn[:]=COMm[:]
选定代码页: MODE CON[:] CP SELECT=yyy
代码页状态: MODE CON[:] CP [/STATUS]
显示模式: MODE CON[:] [COLS=c] [LINES=n]
击键率: MODE CON[:] [RATE=r DELAY=d]
例: 
mode con cols=113 lines=15 & color 9f 此命令设置DOS窗口大小:15行,113列
 
8、GOTO 和 : 
GOTO是跳转的意思。 在批处理中允许以“:XXX”来构建一个标号,然后用GOTO XXX跳转到标号:XXX处,然后执行标号后的命令。 
标签的名字可以随便起,但是最好是有意义的字符串啦,前加个冒号用来表示这个字符串是标签,goto命令就是根据这个冒号(:)来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。
 
9、find 
在文件中搜索字符串。
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V 显示所有未包含指定字符串的行。 
/C 仅显示包含字符串的行数。 
/N 显示行号。 
/I 搜索字符串时忽略大小写。 
/OFF[LINE]不要跳过具有脱机属性集的文件。 
Find常和type命令结合使用
Type [drive:][path]filename | find "string" [>tmpfile] #挑选包含string的行 
Type [drive:][path]filename | find /v "string" #剔除文件中包含string的行 
Type [drive:][path]filename | find /c #显示文件行数 
 
10、start 
批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令
例:
start explorer d:\ 调用图形界面打开D盘
 
11、assoc 和 ftype 文件关联 
assoc 设置'文件扩展名'关联,关联到'文件类型' 
ftype 设置'文件类型'关联,关联到'执行程序和参数' 
当你双击一个.txt文件时,先判断.txt属于 txtfile '文件类型' 再调用 txtfile 关联的命令行 txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1 可以在"文件夹选项"→"文件类型"里修改这2种关联
assoc                     #显示所有'文件扩展名'关联 
assoc .txt               #显示.txt代表的'文件类型',结果显示 .txt=txtfile 
ftype #显示所有'文件类型'关联 
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %* 
assoc .txt=Word.Document.8 设置.txt为word类型的文档,可以看到.txt文件的图标都变了 
assoc .txt=txtfile 恢复.txt的正确关联 
ftype exefile="%1" %* 恢复 exefile 的正确关联 如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
 
12、pushd 和 popd 
切换当前目录 
@echo off 
cd \ & md mp3 #在 C:\ 建立 mp3 文件夹 
md d:\mp4 #在 D:\ 建立 mp4 文件夹 
cd /d d:\mp4 #更改当前目录为 d:\mp4 
pushd c:\mp3 #保存当前目录,并切换当前目录为 c:\mp3 
popd #恢复当前目录为刚才保存的d:\mp4 一般用处不大,在当前目录名不确定时,会有点帮助。
13、CALL
在批处理执行过程中调用另一个批处理或命令,当另一个批处理执行完后,再继续执行原来的批处理
CALL command 调用一条批处理命令,
CALL [drive:][path]filename [batch-parameters] 调用的其它批处理程序。
filename 参数必须具有 .bat 或 .cmd 扩展名。
CALL :label arguments 调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头 以命令goto :eof结尾。
 
批脚本文本参数参照如下:
批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)
批参数(%n)的替代已被增强。您可以使用以下语法:
%~1 - 删除引号("),扩充 %1 
%~f1 - 将 %1 扩充到一个完全合格的路径名 
%~d1 - 仅将 %1 扩充到一个驱动器号 
%~p1 - 仅将 %1 扩充到一个路径 
%~n1 - 仅将 %1 扩充到一个文件名 
%~x1 - 仅将 %1 扩充到一个文件扩展名 
%~s1 - 扩充的路径指含有短名 
%~a1 - 将 %1 扩充到文件属性 
%~t1 - 将 %1 扩充到文件的日期/时间
%~z1 - 将 %1 扩充到文件的大小 
%~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1 扩充到找到的第一个完全合格的名称。
 
如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串可以组合修定符来取得多重结果:
%~dp1 - 只将 %1 扩展到驱动器号和路径 
%~nx1 - 只将 %1 扩展到文件名和扩展名 
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1, 并扩展到找到的第一个文件的驱动器号和路径。 %~ftza1 - 将 %1 扩展到类似 DIR 的输出行
 
在上面的例子中,%1 和 PATH 可以被其他有效数值替换。 %~ 语法被一个有效参数号码终止,修定符不能跟 %*使用 
 
注意:参数扩充时不理会参数所代表的文件是否真实存在,均以当前目录进行扩展
 
 
例: 
@echo off 
Echo 产生一个临时文件 > tmp.txt 
 
pushd c:\windows 
Call :sub tmp.txt 
 
Popd 
Call :sub tmp.txt 
pause 
 
Del tmp.txt 
exit 
 
:sub 
Echo 删除引号: %~1 
Echo 扩充到路径: %~f1 
Echo 扩充到一个驱动器号: %~d1 
Echo 扩充到一个路径: %~p1 
Echo 扩充到一个文件名: %~n1 
Echo 扩充到一个文件扩展名: %~x1 
Echo 扩充的路径指含有短名: %~s1 
Echo 扩充到文件属性: %~a1 
Echo 扩充到文件的日期/时间: %~t1 
Echo 扩充到文件的大小: %~z1 
Echo 扩展到驱动器号和路径:%~dp1 
Echo 扩展到文件名和扩展名:%~nx1 
Echo 扩展到类似 DIR 的输出行:%~ftza1 
Echo. 
Goto :eof
例: 
set aa=123456 
set cmdstr=echo %aa% 
call %cmdstr% 
pause 
本例中如果不用call,而直接运行%cmdstr%,将显示结果%aa%,而不是123456 
 
 
14、shift 
更改批处理文件中可替换参数的位置。
SHIFT [/n]
/n 告诉 命令从第 n 个参数开始移位;n 介于零和八之间。例如:
SHIFT /2
会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。
例句:
@echo off
:aaa
call:. 西瓜 葡萄 苹果 梨子 荔枝
goto :eof
:.
shift 2
echo 显示一个:%1
echo 显示所有用到的参数:%1 %2 %3 %4 %5
echo 正常情况:%*
pause
shift
echo 显示一个:%1
echo 显示所有用到的参数:%1 %2 %3 %4 %5
echo 正常情况:%*
pause
shift
echo 显示一个:%1
echo 显示所有用到的参数:%1 %2 %3 %4 %5
echo 正常情况:%*
pause
call:. 西瓜 葡萄 苹果 梨子 荔枝
goto :eof
:.
shift
shift
shift
echo 显示一个:%1 %2
echo 显示所有用到的参数:%1 %2 %3 %4 %5
echo 正常情况:%*
pause
goto aaa
 
 
15、IF
条件判断语句,语法格式如下:
  (1) IF [NOT] ERRORLEVEL number command 
IF ERRORLEVEL这个句子必须放在某一个命令的后面,执行命令后由IF ERRORLEVEL来判断命令的返回值。 
Number的数字取值范围0~255,判断时值的排列顺序应该由大到小。返回的值大于等于指定的值时,条件成立
(2) IF [NOT] string1==string2 command 
string1和string2都为字符的数据,英文内字符的大小写将看作不同,这个条件中的等于号必须是两个(绝对相等的意思) 条件相等后即执行后面的command检测当前变量的值做出判断
 
为了防止字符串中含有空格,只可用以下格式 
if [NOT] {string1}=={string2} command 
if [NOT] [string1]==[string2] command 
if [NOT] "string1"=="string2" command
(3) IF [NOT] EXIST filename command 
 
16、setlocal 与 变量延迟
例1: 
@echo off 
set a=4 
set a=5 & echo %a% 
pause 
结果:4 
解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?
批处理运行命令的机制:
批处理读取命令时是按行读取的,在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。
我们现在分析一下例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了)。
 
17、ATTRIB 显示或更改文件属性
ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]
+ 设置属性。 - 清除属性。 
R 只读文件属性。 
A 存档文件属性。 
S 系统文件属性。 
H 隐藏文件属性。 
[drive:][path][filename] 指定要处理的文件属性。 
/S 处理当前文件夹及其子文件夹中的匹配文件。 
/D 也处理文件夹。
 
第二节 常用特殊符号
1、@ 命令行回显屏蔽符 
2、% 批处理变量引导符 
3、> 重定向符 
4、>> 重定向符 
5、<、>&、<& 重定向符 
6、| 命令管道符 
7、^ 转义字符 
8、& 组合命令 
9、&& 组合命令 
10、|| 组合命令 
11、"" 字符串界定符 
12、, 逗号 
13、; 分号 
14、() 括号 
15、! 感叹号 
16、批处理中可能会见到的其它特殊标记符: (略) 
CR(0D) 命令行结束符 
Escape(1B) 
ANSI转义字符引导符 
Space(20) 常用的参数界定符 
Tab(09) ; 
= 不常用的参数界定符 
+ COPY命令文件连接符 
* ? 文件通配符 
/ 参数开关引导符 
: 批处理标签引导符
 
1、@ 命令行回显屏蔽符
这个字符在批处理中的意思是关闭当前行的回显。
 
2、% 批处理变量引导符
它只是批处理中的参数而已
引用变量用%var%,
调用程序外部参数用%1至%9   ,为命令行传递给批处理的参数 
%0 批处理文件本身,包括完整的路径和扩展名 
%1 第一个参数 
%9 第九个参数 
%* 从第一个参数开始的所有参数
 
3、> 重定向符 输出重定向命令 这个字符的意思是将运行的结果传递到后面的范围并且覆盖
 
4、>> 重定向符 输出重定向命令 传递并在文件的末尾追加
 
5、<、>&、<& 重定向符
<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。
>&,将一个句柄的输出写入到另一个句柄的输入中。 
<&,从一个句柄读取输入并将其写入到另一个句柄输出中
常用句柄:0、1、2,
未定义句柄:3—9 
1>nul 表示禁止输出正确的信息 
2>nul 表示禁止输出错误信息
简单的办法如下: 
@echo off 
set /p str=<%0 
echo %str% 
pause 
运行显示: @echo off
 
6、| 命令管道符
格式:第一条命令 | 第二条命令 [| 第三条命令...] 将第一条命令的结果作为第二条命令的参数来使用
 
7、^ 转义字符
^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号的特殊功能去掉(^后面不能有空格,否则不起作用)
比如
echo test ^>1.txt
结果则是:test > 1.txt
为什么转义字符放在行尾可以起到续行符的作用呢?原因很简单,因为每行末尾还有一个看不见的符号,即回车符,转义字符位于行尾时就让回车符失效了,从而起到了续行的作用。 
 
8、& 组合命令
就是可以把多个命令组合起来当一个命令来执行。当第一个命令执行失败了,也不影响后边的命令执行。 这里&两边的命令是顺序执行的,从前往后执行。 
 
9、&& 组合命令
当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令
dir z:\ && dir y:\ && dir c:\
 
 
10、|| 组合命令
当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令; 
(组合命令和重定向命令一起使用必须注意优先级 管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令)
 
11、"" 字符串界定符
双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法
cd "program files" 
cd progra~1 
cd pro*
 
12、, 逗号
逗号相当于空格,在某些情况下“,”可以用来当做空格
比如 dir,c:\
 
13、; 分号
分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。
比如: 
dir c:\;d:\;e:\;f:\
运行显示:系统找不到指定的路径。然后终止命令的执行。
例:
dir c:\;d:\;e:\1.txt 
以上命令相当于 dir c:\ dir d:\ dir e:\1.txt 其中文件e:\1.txt不存在,但e盘存在,有错误提示,但命令仍会执行。 
为什么?如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行。
 
14、() 括号
括号中视为一条命令行。 
注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题。 
 
15、! 感叹号 
在变量延迟问题中,用来表示变量,即%var%应该表示为!var!,请看前面的setlocal命令介绍。
 
 
 
第二章 DOS循环:
 
for命令详解 
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母表示可替换的参数。 
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。 
command-parameters 为特定命令指定参数或命令行开关。
 
  1、形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,也就是说,%%I和%%i会被认为不是同一个变量;形式变量I还可以换成其他的字符,但是,为了不与批处理中的%0~%9这10个形式变量发生冲突,请不要随意把%%I替换为%%0 ~%%9中的任意一个;
  2、in和do之间的command1表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为一个元素,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔;
 
之所以要区分cmd窗口和批处理文件两种环境,是因为在这两种环境下,命令语句表现出来的行为虽然基本一样,但是在细节上还是稍有不同,最明显的一个差异就是:在cmd窗口中,for之后的形式变量I必须使用单百分号引用,即%I;而在批处理文件中,引用形式变量I必须使用双百分号,即%%I。为了方便起见,若不是特别强调
参数:/d /l /r /f 
1.参数 
/d 指定的目录
FOR /D %variable IN (set) DO command [command-parameters] 
如果 Set 包含通配符(* 和 ?)这个参数主要用于目录搜索,不会搜索文件,以上代码不能列出含有隐藏目录
例子:
@echo off 
for /d %i in (c:\*) do echo %i 
pause
运行会把C盘根目录下的全部目录名字打印出来,而文件名字一个也不显示!
例子:
@echo off 
for /d %i in (???) do echo %i 
pause 
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了
*号和?号的作用,*号表示任意N个字符,而?号只表示任意一个字符
@echo off 
for /d %i in (window?) do echo %i 
pause 
保存到C盘下执行,会显示什么呢?
显示:windows /D参数只能显示当前目录下的目录名字
 
2.参数 
/R 递归
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
1、set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。 
2、如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录),而不管set中的指定文件是否存在。这与前面所说的单点(.)枚举目录树是一个道理,单点代表当前目录,也可视为一个文件。
例:
@echo off 
for /r c:\ %i in (*.exe) do echo %i
pause
 
例: 
@echo off 
for /r %i in (*.exe) do @echo %i 
pause 以当前目录为搜索路径
 
例: 
@echo off
for /r c:\ %i in (boot.ini) do echo %i 
pause 
运行本例发现枚举了c盘所有目录
 
3.参数 
/L 表示以增量形式从开始到结束的一个数字序列。
FOR /L %variable IN (start,step,end) DO command [command-parameters]
可以使用负的 Step# 以递减数值的方式逐步执行此范围内的值。
例子:
@echo off 
for /l %i in (1,1,5) do @echo %i 
pause 
保存执行看效果,他会打印从1 2 3 4 5 这样5个数字
例子:
@echo off 
for /l %i in (1,1,5) do start cmd 
pause 
怎么多了5个CMD窗口
 
4.参数 
/F      迭代及文件解析 使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。 
详细的帮助格式为: 
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`
 
例1:
@echo off 
rem 首先建立临时文件test.txt 
echo ;注释行,这是临时文件,用完删除 >test.txt 
echo 11段 12段 13段 14段 15段 16段 >>test.txt 
echo 21段,22段,23段,24段,25段,26段 >>test.txt 
echo 31段-32段-33段-34段-35段-36段 >>test.txt 
FOR /F "eol=; tokens=1,3* delims=,- " %i in (test.txt) do echo %i %j %k 
Pause
Del test.txt
运行显示结果:
11段 13段 14段 15段 16段 
21段 23段 24段,25段,26段 
31段 33段 34段-35段-36段 
请按任意键继续. . .
为什么会这样?我来解释: 
eol=; 以分号开头的行为注释行 
tokens=1,3* 将每行第1段,第3段和剩余字段分别赋予变量%i,%j,%k 
delims=,- (减号后有一空格) 以逗号减号和空格为分隔符,空格必须放在最后 
例2:
@echo off 
FOR /F "eol= delims=" %i in (test.txt) do echo %i 
Pause
运行将显示test.txt全部内容,包括注释行
例3:
@echo off 
FOR /F "delims=" %i in ('net user') do @echo %i
pause
两个单引号引起来就表示那个当命令执行
"delims=" 整行显示出一列
 
 
第三章 FOR命令中的变量
变量全部列出来: 
~I - 删除任何引号("),扩展 %I 
%~fI - 将 %I 扩展到一个完全合格的路径名 
%~dI - 仅将 %I 扩展到一个驱动器号 
%~pI - 仅将 %I 扩展到一个路径 
%~nI - 仅将 %I 扩展到一个文件名 
%~xI - 仅将 %I 扩展到一个文件扩展名 
%~sI - 扩展的路径只含有短名 
%~aI - 将 %I 扩展到文件的文件属性 
%~tI - 将 %I 扩展到文件的日期/时间 
%~zI - 将 %I 扩展到文件的大小 
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展 到找到的第一个完全合格的名称。
比如:
FOR /F %z IN ('set') DO @echo %z 
代入的变量名是z那么就要把那个I改成z,例如%~fI改为%~fz 至于前面的%~p这样的内容就是语法了! 
 
 
一、 ~I - 删除任何引号("),扩展 %I这个变量的作用就如他的说明,删除引号!
例子: 
@echo off 
echo ^"1111>temp.txt 
echo "2222">>temp.txt 
echo 3333^">>temp.txt 
echo "4444"44>>temp.txt 
echo ^"55"55"55>>temp.txt
FOR /F "delims=" %i IN (temp.txt) DO echo %~i 
pause 
del temp.txt 
回显如下: 
1111 #字符串前的引号被删除了 
2222 #字符串首尾的引号都被删除了 
3333" #字符串前无引号,后面的引号保留 
4444"44 #字符串前面的引号删除了,而中间的引号保留 
55"55"55 #字符串前面的引号删除了,而中间的引号保留 
请按任意键继续. . .
 
和之前temp.txt中的内容对比一下,我们会发现第1、2、4、5行的引号都消失了,这就是删除引号~i的作用了! 
删除引号规则如下(BAT兄补充!) 
1、若字符串首尾同时存在引号,则删除首尾的引号; 
2、若字符串尾不存在引号,则删除字符串首的引号; 
3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除。
龙卷风补充:无头不删,有头连尾删。 
 
 
二、 %~fI - 将 %I 扩展到一个完全合格的路径名
例子:  
FOR /F "delims==" %i IN ('dir /b') DO @echo %~fi 
pause
显示内容如下
C:\Documents and Settings\Administrator\桌面\test.bat 
C:\Documents and Settings\Administrator\桌面\test.vbs 
当我把代码中的 %~fi直接改成%i 
 
FOR /F "delims==" %i IN ('dir /b') DO @echo %i 
pause
显示以下内容: test.bat test.vbs 
 
三、 %~dI - 仅将 %I 扩展到一个驱动器号
例子: 
FOR /F "delims==" %i IN ('dir /b') DO @echo %~di
pause 
显示如下 
C: 我桌面就两个文件test.bat,test.vbs,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会把他这文件 或者目录所在的盘符号打印出来! 
 
四、 %~pI - 仅将 %I 扩展到一个路径
例子:
 FOR /F "delims==" %i IN ('dir /b') DO @echo %~pi 
pause
 
五、 %~nI - 仅将 %I 扩展到一个文件名 只打印文件名字 
例子:
FOR /F "delims==" %i IN ('dir /b') DO @echo %~ni 
pause 
 
六、 %~xI - 仅将 %I 扩展到一个文件扩展名 只打印文件的扩展名 
FOR /F "delims==" %i IN ('dir /b') DO @echo %~xi 
pause 
 
七、 %~sI - 扩展的路径只含有短名,打印绝对短文件名 
FOR /F "delims==" %i IN ('dir /b') DO @echo %~si 
pause 
 
八、 %~aI - 将 %I 扩展到文件的文件属性 打印文件的属性 
FOR /F "delims==" %i IN ('dir /b') DO @echo %~ai 
pause 
 
九、 %~tI - 将 %I 扩展到文件的日期/时间 打印文件建立的日期 
FOR /F "delims==" %i IN ('dir /b') DO @echo %~ti 
pause 
 
十、 %~zI - 将 %I 扩展到文件的大小 打印文件的大小 FOR /F "delims==" %i IN ('dir /b') DO @echo %~zi 
pause 
上面例子中的"delims=="可以改为"delims=",即不要分隔符 
 
十一、 %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。
@echo off 
FOR /F "delims=" %i IN ("notepad.exe") DO echo %~$PATH:i 
pause
显示结果为C:\WINDOWS\system32\notepad.exe
他的意思就在PATH变量里指定的路径里搜索notepad.exe文件,如果有notepad.exe则会把他所在绝对路径打印出来
 
 
 
 第四章 批处理中的变量
批处理中的变量分为两类,分别为"系统变量"和"自定义变量"
 
一、系统变量
他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值, 不需要我们来给他赋值,我们只需要调用而以! 我把他们全部列出来! 
%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。 
%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。 
%CD% 本地 返回当前目录字符串。 
%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。 
%COMPUTERNAME% 系统 返回计算机的名称。 
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。 
%DATE% 系统 返回当前日期。
%ERRORLEVEL% 系统 返回上一条命令的错误代码。通常用非零值表示错误。 
%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。
%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 
%LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。 
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。 
%OS% 系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。 
%PATH% 系统 指定可执行文件的搜索路径。 
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64 基于Itanium 
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。 
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。 
%PROCESSOR_REVISION% 系统 返回处理器的版本号。
%PROMPT% 本地 返回当前解释程序的命令提示符设置。 
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。 
%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。 
%SYSTEMROOT% 系统 返回 Windows server operating system 根目录的位置。 
%TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。
%TIME% 系统 返回当前时间。
%USERDOMAIN% 本地 返回包含用户帐户的域的名称。 
%USERNAME% 本地 返回当前登录的用户的名称。 
%USERPROFILE% 本地 返回当前用户的配置文件的位置。 
%WINDIR% 系统 返回操作系统目录的位置。 
%USERNAME% 本地 返回当前登录的用户的名称。 
%RANDOM% 随机变量
注意有空格的目录要用引号引起来 另外还有一些系统变量,他们是代表一个意思,或者一个操作!
 
 
 
 
二,参数
他们分别是%0 %1 %2 %3 %4 %5 ......一直到%9 还有一个%*
%0 这个有点特殊,有几层意思,先讲%1-%9的意思.
%1 返回批处理的第一个参数 
%2 返回批处理的第二个参数 
%3-%9依此推类反回批处理参数?
到底怎么个返回法?
例子:
@echo off 
echo %1 %2 
echo %1 
echo %2 
进入CMD,输入cd c:\ 然后输入 test.bat 我是第一个参数 我是第二个参数 
结果:
我是第一个参数 我是第二个参数 
我是第一个参数 
我是第二个参数 
 
%* 的作用不是很大,只是返回参数而已,不过他是一次返回全部参数的值,不用在输入%1 %2来确定一个个的 
例子 :
@echo off 
echo %*
同样保存为test.bat 放到C盘 进入CMD,输入cd c:\ 然后输入 test.bat 第一个参数 第二个参数 
可以看到他一次把全部参数都显示出来了 
 
%0
第一层意思:返回批处理所在绝对路径
例子: 
@echo off 
echo %0 
pause
保存为test.BAT放在桌面运行,
结果 "C:\Documents and Settings\Administrator\桌面\test.bat"
 
第二层意思:无限循环执行BAT
例子: 
@echo off
net user %0
保存为BAT执行,他就会无限循环执行net user这条命令,直到你手动停止. 
龙卷风补充:其实%0就是第一参数%1前面那个参数
 
 
 
三、自定义变量
使用set命令
例子:
@echo off 
set var=我是值 
echo %var% 
pause
保存为BAT执行,我们会看到CMD里返回一个 "我是值"
例子:
@echo off 
set /p var=请输入变量的值 
echo %var% 
pause
var变量名=号右边的是提示语,不是变量的值 变量的值由我们运行后自己用键盘输入!
 
 
第五章 set命令详解
1.用set命令设置自定义变量
显示、设置或删除 cmd.exe 环境变量。 
SET [variable=[string]] variable 指定环境变量名。 
string 指定要指派给变量的一系列字符串或命令
#####################################
 
SET variable=
清除变量variable的值,使其变成未定义状态(等号后没有字符)
 
#####################################
SET variable="",此时变量值并不为空,而是等于两个引号,即"" 
例子: 
@echo off 
set var=我是值 
echo %var% 
pause
引用这个变量就把var变量名用两个%(百分号)扩起来
例子: 
@echo off 
set /p var=请输入变量的值: 
echo 您输入了 %var% ~_~ 
pause
 
2.用set命令进行简单计算
语法:SET /A expression 
/A 让SET可以支持数学符号进行加减等一些数学运算
 
该表达式 : 
  ()                   - 分组
   ! ~ -               - 一元运算符
  * / %  + -             - 算数运算符
<< >>           - 逻辑移位
      - 按位“与”
    ^                   - 按位“异”
    |                   - 按位“或”
    = *= /= %= += -=     - 赋值
      &= ^= |= <<= >>=
  ,                   - 表达式分隔符
(1)
@echo off 
set /p input=请输入计算表达式: 
set /a var=%input% +1
echo 计算结果:%var% 
pause
DOS计算只能精确到32位,这个32位是指二进制32位,其中最高位为符号位(0为正,1为负),低位31位为数值。31个1换成十进制为2147483647,所以DOS计算的有效值范围是-2147483648至2147483647,超出该数值范围时计算出错
 
叠加操作:
set /a var+=1 
set /a var = %var% + 1 
 
(2)
在"逻辑或取余操作符"时,我们需要把他们用双引号引起来,也可以用转义字符^
例子
set /a var= 1 "&" 1 与运算
set /a var= 1 "+" 1 异运算 
set /a var= 1 "%" 1 取与运算 
set /a var= 3 "<<" 2 左移位运算, 3的二进制为11,左移2位为1100,换成十进制就是12,
set /a var= 4 ">>" 2 右移位运算,4的二进制为100,右移动2位为1,结果为1
龙卷风补充:凡是按位计算均需换算成二进制。
 
思考题:求2的n次方 
参考答案: 
@echo off 
set /p n=请输入2的几次方: 
set /a num=1^<^
echo %num% 
pause
运行结果: 
请输入2的几次方: 3 8 请按任意键继续. . .
请输入2的几次方: 10 1024 请按任意键继续. . .
请输入2的几次方: 15 32768 请按任意键继续. . .
 
3、用set命令进行字符串处理 
 
(1)字符串替换
%PATH:str1=str2% 
意思就是:将字符串变量%PATH%中的str1替换为str2 这个是替换变量值的内容
例子:
@echo off 
set a= bbs. verybat. cn 
echo 替换前的值: "%a%" 
set var=%a: =% 
echo 替换后的值: "%var%" 
pause
运行显示:替换前的值: " bbs. verybat. cn" 
替换后的值: "bbs.verybat.cn"
 
对比一下,我们发现他把变量%a%的空格给替换掉了,从这个例子,我们就可以发现 %PATH:str1=str2%这个操作就是把变量%PATH%的里的str1全部用str2替换
 
比如我们把上面的例子改成这样 
@echo off 
set a=bbs.verybat.cn 
echo 替换前的值: "%a%" 
set var=%a:.=伤脑筋% 
echo 替换后的值: "%var%" 
pause
运行显示: 替换前的值: "bbs.verybat.cn" 替换后的值: "bbs伤脑筋verybat伤脑筋cn"
 
执行后就会把变量%a%里面的"."全部替换为"伤脑筋" 这就是set的替换字符的很好的功能! 替换功能先讲到这,下面将字符串截取功能
 
请注意:字符串的替换和截取功能在引用变量的地方均可以,并不一定必须要有set命令 
例:
@echo off 
set a=bbs.verybat.cn 
echo 替换前的值: "%a%" 
echo 替换后的值: "%a:.=伤脑筋%" 
pause 
此例在echo语句中就替换了字符串,效果一样。
 
 
(2)字符串截取
截取功能统一语法格式为:%a:~[m[,n]]% 
方括号表示可选,
%为变量标识符,a为变量名,不可少,
冒号用于分隔变量名和说明部分,
符号~可以简单理解为“偏移”即可,
m为偏移量(缺省为0),
n为截取长度(缺省为全部) 
@echo off
set str=123456789
echo 第一个字符为:%str:~0,1%
echo 头两个字符为:%str:~0,2%
echo 头5个字符为:%str:~0,5%
echo 去掉最后一个字符后的字符串为:%str:~0,-1%
echo 去掉最后3个字符后的字符串为:%str:~0,-3%
echo 第4个字符为:%str:~3,1%
echo 第4个及其之后的3个字符为:%str:~3,4%
echo 最后一个字符为:%str:~-1%
echo 最后一个字符为:%str:~-1,1%
echo 最后一个字符为:%str:~-1,2%
echo 倒数第4个字符为:%str:~-4,1%
echo 倒数第4个及其之后的字符为:%str:~-4%
echo 倒数第4个及其之后的1个字符为:%str:~-4,2%
echo 倒数第4个及其之后的2个字符为:%str:~-4,3%
pause
 
思考题目:输入任意字符串,求字符串的长度 
参考答案:
方案一、
@echo off 
set mystr= 
set /p mystr=输入要计算长度的字符串(直接回车退出): 
if not defined mystr goto :eof 
set count=0 
setlocal enabledelayedexpansion 
 
:intercept 
set /a count+=1 
for /f %%i in ("%count%") do if not "!mystr:~%%i,1!"=="" goto intercept 
echo 长 度: %count% 
pause 
goto :eof 
 
:began 
set /p mystr=输入要计算长度的字符串: 
echo %mystr:~0,1% | findstr /i "q" 1>nul 2>nul && exit rem 输入q退出 
call :bflen "%mystr%" 
rem 这两句调用bflen,返回长度到变量ret中。 
echo 字符串: "%mystr%" 
echo 长 度: %ret% 
goto began 
 
:bflen 
set num= 
set str= 
set ret= 
set str=%1 
 
:len
set str=%str:~0,-1% 
set /a num = %num% + 1 
if defined str goto len 
set /a ret = %num% - 2 
set num= 
goto eof
 
方案二、
@echo off & setlocal EnableDelayedExpansion 
:began 
set mystr= 
set /p mystr=输入要计算长度的字符串(直接回车退出): 
if not defined mystr goto :eof 
for /l %%i in (0,1,1000) do if "!mystr:~%%i,1!"=="" set strlen=%%i && goto :_endfor 
:_endfor 
::echo 字符串: "%mystr%" 
echo 长 度: %strlen% 
set strlen= 
goto began 
 
 
第六章 if命令讲解
 
IF有3种基本的用法
IF [NOT] ERRORLEVEL number command 
IF [NOT] /i string1==string2 command 
IF [NOT] EXIST filename command
ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出编码,指定条件为 true。errorlevel返回值可以在0~255之间
string1==string2 如果指定的文字字符串匹配,指定条件为 true。
EXIST filename 如果指定的文件名存在,指定条件为 true。
ELSE 子句必须在 IF 之后出现在同一行上。
例如:
IF EXIST filename ( del filename ) ELSE ( echo filename missing ) 
 
第一种用法:IF [NOT] ERRORLEVEL number command
例子: 
@echo off 
net user 
IF %ERRORLEVEL% == 0 echo net user 执行成功了! 
pause
"成功"用0表示 "失败"用1表示 
 
第二种用法:IF [NOT] string1==string2 command
这个呢就是用来比较变量或者字符的值是不是相等的.
例子 
@echo off 
set /p var=请输入第一个比较字符: 
set /p var2=请输入第二个比较字符: 
if %var% == %var2% (echo 我们相等) ELSE echo 我们不相等 
pause
 
第三种用法:IF [NOT] EXIST filename command
这个就是判断某个文件或者文件夹是否存在的语法
例子 
@echo off 
if exist "c:\test" (echo 存在文件) ELSE echo 不存在文件 
pause
 
第四种用法:
IF增强的用法
IF [/I] string1 compare-op string2 command
#参数/I表示不区分大小写 
 
IF CMDEXTVERSION number command 
#判断变量是否存在,CMDEXTVERSION的作用跟ERRORLEVEL 的一样,除了它是在跟与命令扩展名有关联的内部版本号比较。第一个版本是1。每次对命令扩展名有相当大的增强时,版本号会增加一个。 命令扩展名被停用时,CMDEXTVERSION 条件不是真的。
 
如果已定义环境变量,DEFINED 条件的作用跟 EXISTS 的一样 
IF DEFINED variable command 
IF NOT "variable"=="" command 
上面两条命令效果一样。
用“set variable=”命令使变量variable变成未定义,即空值。
一句话,变量值为空,则为未定义;变量值不为空,则为已定义。 
用语句IF DEFINED variable command判断变量是否存在时,请注意variable为不使用引导符号%的变量名,不能用写为%variable%,否则出错。
 
例: 
if defined aa (echo 变量aa存在) else (echo 变量aa不存在) 
运行显示:变量aa不存在
 
最后面还有一些用来判断数字的符号
EQU - 等于 NEQ - 不等于 LSS - 小于 
LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于
 
@echo off 
set /p var=请输入一个数字: 
if %var% LEQ 4 (echo 我小于等于4) ELSE echo 我不小于等于4 
pause 
 
 
 
 第七章 DOS编程高级技巧
1.交互界面设计
用户交互 
  批处理,黑框白字是它最著名的特征。虽然当初DOS为人们使用计算机做出了莫大的贡献,但在Windows盛行的今天,人们已经疏远并且惧怕那个黑色的窗口了。微软为了让先天有着批量处理“体力活”能力的DOS避免“冷酷”,便于接近,特意提供了几个小命令,加强批处理的用户交互功能。
  【 1.视窗 】
  首先我们要DIY它的窗口。使用命令:color、mode、msg。
  --1.设置窗口背景色和字体颜色by color。详细内容参见color /?。
  --2.设置窗口大小by "MODE CON [COLS=c] [LINES=n]",cols即宽度,lines即高度。
  --3.GUI交互窗口by msg。详细内容参见msg /?。
  视窗DIY举例:
  ===============================================
  @echo off
  set a=10
  set b=0
  :tex
  set /a a+=3
  set /a b+=1
  mode con cols=%a% lines=%b%
  if %a% lss 60 goto :tex
  echo O(∩_∩)O 圣诞快乐 O(∩_∩)O
  set a=15,a6,2e,d0,34,8b,4f,9d,5e
  for %%i in (%a%) do (
  ping -n 2 127.1>nul
  color %%i
  )
  for %%i in (%a%,%a%) do (
  ping -n 1 127.1>nul
  color %%i
  )
  >>ms.txt echo */. . . * .
  >>ms.txt echo .\* . [] * __
  >>ms.txt echo */ . ./\~~~~~~~'\. ^|
  >>ms.txt echo \* ,/,..,\,................,\.
  >>ms.txt echo ^|^| ..▎# ▎田 田 ▎ ^| ▎
  >>ms.txt echo ^|^| ^&^&▎ ▎ ▎'^|'▎ o
  >>ms.txt echo ^|^| ##■■■■■■■■■■〓
  msg %username% /w /time:3600
  del ms.txt
  pause
  ===============================================
  【 2.声音 】
  呵呵,是不是注意到了批处理没有声音呐?闲话不说,直接做实验吧 ^_^
  ===============================================
  @echo off
  echo 做好准备,响了啊!!
  pause
  cls
  echo
  echo 怎么样?呵呵,刺激吧~
  pause
  cls
  mshta vbscript:createobject("sapi.spvoice").speak("Merry Christmas and Happy New Year!")(window.close)
  pause
  ===============================================
  此处,这个就是调用vbs的方法:vbscript:createobject("sapi.spvoice").speak("Merry Christmas and Happy New Year!")
  speak 有人说如果tts安装了中文引擎是可以讲中文的。
  其实不然我测试了一下只要打上拼音(一个字和一个字的拼音中间需要加空格)就可以说中文啦~
  【 3.控制 】
  在运行批处理的过程中,我们如何干预批处理呢?呵呵,直接点叉叉就可以结束它了!嗯,不错,不过,太野蛮了~
  --1.暂停批处理:直接按键盘上的Pause键喽
  --2.终止批处理:组合键Ctrl+C。不过,有时候它好像响应的不太积极啊…
 
2.if…else…条件语句
EQU - 等于 NEQ - 不等于 LSS - 小于 LEQ - 小于或等于 GTR - 大于 GEQ - 大于或等于 
上面的command命令都可以用小括号来使用多条命令的组合,包括else子句,组合命令中可以嵌套使用条件或循环命令。
例如:
IF EXIST filename ( del filename ) ELSE ( echo filename missing )
也可写成: 
if exist filename (del filename) else (echo filename missing) 
 
3.循环语句
(1)指定次数循环 
(2)对某集合执行循环语句
(3)条件循环 
利用goto语句和条件判断
例: 
@echo off 
set var=0 
:continue 
set /a var+=1
echo 第%var%次循环 
if %var% lss 100 goto continue 
echo 循环执行完毕 
pause
例: 
@echo off 
set var=100 
rem ************循环开始了 
:continue 
echo 第%var%次循环 
set /a var-=1 if %var% gtr 0 goto continue 
rem ************循环结束了 
echo 循环执行完毕 
pause
 
4.子程序
格式: CALL :label arguments
子程序例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 
 
6.用ftp命令实现自动下载
ftp是常用的下载工具,ftp界面中有40多个常用命令,自己学习了,不介绍了。这里介绍如何用dos命令行调用ftp命令,实现ftp自动登录,并上传下载,并自动退出ftp程序。 其实可以将ftp命令组合保存为一个文本文件,然后用以下命令调用即可。
ftp -n -s:[[drive:]path]filename
上面的filename为ftp命令文件,包括登录IP地址,用户名、密码、操作命令等 
例: 
open 90.52.8.3 #打开ip 
user iware #用户为iware 
password 8848 #密码 
bin #二进制传输模式 
prompt cd tmp1 #切换至iware用户下的tmp1目录 
pwd lcd d:\download #本地目录 
mget * #下载tmp1目录下的所有文件 
bye #退出ftp 
 
6.用7-ZIP实现命令行压缩和解压功能
语法格式:
7z [...] [...]
为压缩包名称 
为文件名称,支持通配符或文件列表
是7z.exe包含的命令
列举如下:
a: Adds files to archive. 添加至压缩包 
参数: -i (Include) -m (Method) -p (Set Password) -r (Recurse) -sfx (create SFX) -si (use StdIn) -so (use StdOut) -ssw (Compress shared files) -t (Type of archive) -u (Update) -v (Volumes) -w (Working Dir) -x (Exclude)
 
b: Benchmark
 
d: Deletes files from archive. 从压缩包中删除文件 
参数:
-i (Include) -m (Method) -p (Set Password) -r (Recurse) -u (Update) -w (Working Dir) -x (Exclude)
e: Extract 解压文件至当前目录或指定目录 
参数: -ai (Include archives) -an (Disable parsing of archive_name) -ao (Overwrite mode) -ax (Exclude archives) -i (Include) -o (Set Output Directory) -p (Set Password) -r (Recurse) -so (use StdOut) -x (Exclude) -y (Assume Yes on all queries)
 
l: Lists contents of archive. t: Test u: Update
 
x: eXtract with full paths用文件的完整路径解压至当前目录或指定目录 
参数: -ai (Include archives) -an (Disable parsing of archive_name) -ao (Overwrite mode) -ax (Exclude archives) -i (Include) -o (Set Output Directory) -p (Set Password) -r (Recurse) -so (use StdOut) -x (Exclude) -y (Assume Yes on all queries)
 
 
 
7.调用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 语法和有效的宿主参数。
 
 
8.将批处理转化为可执行文件:
由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。
 
Bat2Com就可以完成这个转换工作。 
用法:Bat2Com FileName,这样就会在同一目录下生成一个名为FileNme.com的可执行文件,执行的效果和原来的.bat文件一样。
 
小知识:在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同的这四类文件,当只键入文件名时,DOS执行的是name.com,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。
这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS窗口的命令行中,
 
 
 
9.时间延迟
什么是时间延迟?顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。 延迟的应用见下节:“模拟进度条”。 
(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
::-----------以下为延时子程序-------------------- 
 
10.模拟进度条
下面给出一个模拟进度条的程序。如果将它运用在你自己的程序中,可以使你的程序更漂亮。
@echo off 
mode con cols=113 lines=15 
&color 9f 
cls 
echo. 
echo 程序正在初始化. . . 
echo. 
set/p= ■
for /L %%i in (1 1 38) do set /p a=■nul 
echo 100%% 
pause
 
解说:“set /p a=■nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。
 
 
11.特殊字符的输入及应用
开始 -> 运行 -> 输入cmd -> edit -> ctrl+p(意思是允许输入特殊字符)-> 按ctrl+a将会显示笑脸图案。
(如果要继续输入特殊字符请再次按ctrl+p,然后ctrl+某个字母)
以上是特殊字符的输入方法,选自[英雄]教程,很管用的。也就是用编辑程序edit输入特殊字符,然后保存为一文本文件,再在windows下打开此文件,复制其中的特殊符号即可。一些简单的特殊符号可以在dos命令窗口直接输入,并用重定向保存为文本文件。 
例: 
C:>ECHO ^G>temp.txt 
“^G”是用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。 
特殊字符的应用也很有意思,这里仅举一例:退格键退格键表示删除左边的字符,此键不能在文档中正常输入,但可以通过edit编辑程序录入并复制出来。即 “”。
 
利用退格键,可以设计闪烁文字效果
例:文字闪烁 
@echo off 
:start 
set/p=床前明月光
::显示文字,光标停于行尾 
ping -n 1 127.0.0.1>nul 
::设置延迟时间 
set /p a=
:: 输出一些退格符将光标置于该行的最左端(退格符的数量可以自己调整)。 
set /p a=
::输出空格将之前输出的文字覆盖掉。 
set /p a=
::再次输出退格符将光标置于该行的最左端,这里的退格符数量一定不能比前面的空格数少。 
::否则光标不能退到最左端。 
goto start 
例:输出唐诗一首,每行闪动多次 
@echo off 
setlocal enabledelayedexpansion
set str=床前明月光 疑是地上霜 举头望明月 低头思故乡 
::定义字符串str 
for %%i in (%str%) do (rem 由于str中含有空格,则以空格为分隔符将str中的每一个部分依次赋给变量%%i。 set char=%%i echo. echo. for /l %%j in (0,1,5) do ( set/p=!char:~%%j,1!nul 
rem 设置输出每个字符的时间延迟。 ) call :hero %%i ) 
pause>nul 
exit
:hero 
for /l %%k in (1,1,10) do ( ping /n 0 127.0.0.1>nul set /p a=nul set /p a=%1
::文字闪动 
goto :eof
 
十二、随机数(%random%)的应用技巧
%RANDOM% 系统变量 返回 0 到 32767 之间的任意十进制数字,2的15次方等于32768。由 Cmd.exe 生成。
如何获取100以内的随机数呢?
例:生成5个100以内的随机数 
@echo off 
setlocal enabledelayedexpansion 
for /L %%i in (1 1 5) do ( set /a randomNum=!random!%%100 echo 随机数:!randomNum! ) 
pause 
运行结果:(每次运行不一样) 随机数:91 随机数:67 随机数:58 随机数:26 随机数:20 请按任意键继续. . .
求余数运算set /a randomNum=!random!%%100中的100可以是1~32768之间的任意整数。
总结:利用系统变量%random%,求余数运算%%,字符串处理等,可以实现很多随机处理。
 
思考题目:生成给定位数的随机密码 解答思路:
将26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。
参考答案1:(简单)
@echo off 
call :randomPassword 5 pass1 pass2 
echo %pass1% %pass2% 
pause 
exit
:randomPassword 
set password_len=%1 
if not defined password_len goto :eof 
if %password_len% lss 1 goto :eof 
set wordset=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 
set return=
set num=0 
:randomPassword1 
set /a num+=1 
set /a numof=%random%%%26+1 
for /f "tokens=%numof% delims= " %%i in ("%wordset%") do set return=%return%%%i 
if %num% lss %password_len% goto randomPassword1 
if not "%2"=="" set %2=%return% 
shift /2 if not "%2"=="" goto randomPassword 
goto :eof
 
参考答案2:(最优) 
@echo off call 
:randomPassword 6 pass1 pass2 pass3 
echo %pass1% %pass2% %pass3% 
pause 
exit
:randomPassword 
::---------生成随机密码 
::---------%1为密码长度,%2及以后为返回变量名称 
::---------goto循环、变量嵌套、命令嵌套 
@echo off 
if "%1"=="" goto :eof 
if %1 lss 1 goto :eof 
set password_len=%1 
set return= set wordset=abcdefghijklmnopqrstuvwxyz023456789_ 
::---------------------------循环 
:randomPassword1 
set /a numof=%random%%%36 call set return=%return%%%wordset:~%numof%,1%% 
set /a password_len-=1 
if %password_len% gtr 0 goto randomPassword1 
::---------------------------循环 
if not "%2"=="" set %2=%return% 
shift /2 
if not "%2"=="" goto randomPassword 
goto :eof
说明:本例涉及到变量嵌套和命令嵌套的应用,见后。
 
 
十三、变量嵌套 与 命令嵌套
 
    和其它编程语言相比,dos功能显得相对简单,要实现比较复杂的功能,需要充分运用各种技巧,变量嵌套与命令嵌套就是此类技巧之一。
 
先复习一下前面的“字符串截取”的关键内容:
 
**********************************************
截取功能统一语法格式为:%a:~[m[,n]]%
**********************************************
方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)。
 
百分号如果需要当成单一字符,必须写成%%
 
以上是dos变量处理的通用格式,如果其中的m、n为变量,那么这种情况就是变量嵌套了。
 
比如设变量word为“abcdefghij”,变量num为“eee4eeeee”
%word:~4,1%为e,其中4可以从变量num中取值,即%num:~3,1%,写成组合形式如下:
%word:~%num:~3,1%,1% 经测试这种写法不能正确执行,那么,怎么实现这种变量嵌套呢?首先,我们将其中的%num:~3,1%作为正常的字符处理命令,其它部分当成一般字符串,这样首尾的%就必须写成%%了,即%%word:~%num:~3,1%,1%%
但是上面的写法同样不能直接当成命令执行,必须运用命令嵌套才能执行。
 
什么是命令嵌套呢?简单的说,首先用一条dos命令生成一个字符串,而这个字符串是另一条dos命令,用call语句调用字符串将其执行,从而得到最终结果。
 
例:用call语句实现命令嵌套
@echo off
set str1=aaa 
echo ok bbb
echo 初始字符串:%str1%
echo 生成命令字符串如下:
echo %str1:~4,7%
echo 运行命令字符串生成最终结果为:
call %str1:~4,7%
pause
 
运行显示:
 
初始字符串:aaa echo ok bbb
生成命令字符串如下:
echo ok
运行命令字符串生成最终结果为:
ok
请按任意键继续. . .
 
 
变量嵌套与命令嵌套结合运用,见下例。
@echo off
 
set num=Redtek 2006 bbs.cn-dos.net
set a=123245
set b=87754321
 
echo.
echo a=%a%  b=%b%  num=%num%
set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo 直接运行命令,只解析第一层变量,其余的当作字符串:%result%
 
call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo 一层命令嵌套,可解析两层变量,其余的当作字符串:%result%
 
call call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo 两层命令嵌套,可解析三层变量,其余的当作字符串:%result%
 
call call call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo 三层命令嵌套,运行变量解析完后的字符串:%result%
 
pause
 
 
十四、文件内容筛选(type和findstr命令结合使用)
 
Find常和type命令结合使用
Type [drive:][path]filename | find "string" [>tmpfile] #挑选包含string的行
Type [drive:][path]filename | find /v "string"   #剔除文件中包含string的行
Type [drive:][path]filename | find /c   #显示文件行数
以上用法将去除find命令自带的提示语(文件名提示)
 
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
 
  /V        显示所有未包含指定字符串的行。
  /C        仅显示包含字符串的行数。
  /N        显示行号。
  /I        搜索字符串时忽略大小写。
  /OFF[LINE] 不要跳过具有脱机属性集的文件。
  "string"  指定要搜索的文字串,
  [drive:][path]filename
            指定要搜索的文件。
 
如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。
 
find命令不能处理文件中超过1024个字符的数据行,此时可用findstr命令。(见前面介绍)
 
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]
 
  /B        在一行的开始配对模式。
  /E        在一行的结尾配对模式。
  /L        按字使用搜索字符串。
  /R        将搜索字符串作为一般表达式使用。
  /S        在当前目录和所有子目录中搜索
              匹配文件。
  /I         指定搜索不分大小写。
  /X        打印完全匹配的行。
  /V        只打印不包含匹配的行。
  /N        在匹配的每行前打印行数。
  /M        如果文件含有匹配项,只打印其文件名。
  /O        在每个匹配行前打印字符偏移量。
  /P        忽略有不可打印字符的文件。
  /OFF[LINE] 不跳过带有脱机属性集的文件。
  /A:attr   指定有十六进位数字的颜色属性。请见 "color /?"
  /F:file   从指定文件读文件列表 (/ 代表控制台)。
  /C:string 使用指定字符串作为文字搜索字符串。
  /G:file   从指定的文件获得搜索字符串。 (/ 代表控制台)。
  /D:dir    查找以分号为分隔符的目录列表
  strings   要查找的文字。
  [drive:][path]filename
            指定要查找的文件。
 
除非参数有 /C 前缀,请使用空格隔开搜索字符串。
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或
"there" 。  'FINDSTR /C:"hello there" x.y' 文件 x.y  寻找
"hello there"。
 
一般表达式的快速参考:
  .        通配符: 任何字符
  *        重复: 以前字符或类别出现零或零以上次数
  ^        行位置: 行的开始
  $        行位置: 行的终点
  [class]  字符类别: 任何在字符集中的字符
  [^class] 补字符类别: 任何不在字符集中的字符
  [x-y]    范围: 在指定范围内的任何字符
  \x       Escape: 元字符 x 的文字用法
  \
  xyz\>    字位置: 字的结束

转载于:https://blog.51cto.com/zhixuan/817177