BAT批处理学习笔记
一、批注里定义:批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD,这些命令统称批处理命令。
二、常见的批处理指令:
命令清单:
1、REM 和 ::
2、ECHO 和 @
3、PAUSE
4、ERRORLEVEL
5、TITLE
6、COLOR
7、mode 配置系统设备
8、GOTO 和 :
9、FIND、FINDSTR
10、START
11、assoc 和 ftype
12、pushd 和 popd
13、CALL
14、shift
15、IF
16、setlocal 与 变量延迟
17、ATTRIB 显示或更改文件属性
1、REM 和、::和%Annotation%
--注释命令,REM、::、%Annotation%都用来注释,区别有2个:
a. REM后边的命令不会执行,但会回显(仅在echo on的情况下),而::后边的命令不执行也不会回显(无论是echo on 或者 off)。
b. 其中”:”配合字母或数字开头的字符串,表示一个被goto识别的标号,而“:”配合如“+”,“-”,“:”等特殊字符,功能和“::”一样。
c. %Var%,表示变量,如果改变量不会被使用的话,就可以认为是个行内注释(不常用)。
eg:
@echo on
echo Hello,World %这里直接执行了echo命令,显示hello,world%
rem echo Hello,word %这里没有执行echo命令,而是显示rem echo hello,world%
::@echo 按任意键结束 & pause > nul
@set /p="按任意键结束" < nul & pause > nul
2、ECHO 和 @
--回显指令,@字符放在命令前面将关闭该条命令的回显,无论是echo on 或者off。
ECHO指令的用法:
a. echo {on|off}, 表示打开或者关闭回显,可以配合@不显示该命令本身. 在DOS状态下,输入echo off将不显示c/>:等提示符.
b. echo, 表示当先回显状态.
c. echo Hello,world! 显示内容,Hello,World.
d. echo., 表示输出空行,其中.可以是任何”,”、”:”等特殊字符但不能有空格. 注意echo.后边可以跟”|”DOS专项管道符作为其他命令的输入, 即在执行完管道命令后给出一个回车.
e. echo 答复语|命令, 用于简化的人机对话命令, 相当于在出现人机对话框时自动输入”Y”等答复语.
f. echo 内容>文件名, 将内容写入文件名所示的文件, 其中@echo off>1.txt, 可以创建空白文件.
echo 内容>>文件名, 将内容追加到文件名所示的文件中.
g: echo 打印机控制码>;PRN, 打印控制码是按住<Alt>建,在小键盘上输入156, Alt+156,Alt+42,Alt+116表示F5*t.
echo 打印内容>;PRN
h: echo ^G, 使用喇叭鸣响. 其中”^G”这个特殊符号是按住Ctrl+G或者Alt+007输入产生鸣响.
eg:
echo off %关闭回显%
echo on %打开回显%
echo %当前回显状态%
echo Hello,World %这里显示echo命令本身,也显示结果hello,world%
@echo Hello,World %这里不显示echo命令本身,只显示结果hello,world%
@echo off
echo. %这里输出空行%
time %显示当前时间, 并输入新的时间%
echo.|time %显示当前之间并给出回车,并返回Dost提示符%
md 123 %创建123目录%
ping localhost>123\123.txt %创建1个txt文件%
::rd 123 /s %删除123目录及其下的所有文件, 会给出确认提示%
echo Y|rd 123 /s %删除123目录及其下的所有文件,并自动确认%
@echo off>123.txt %创建名为123.txt的空文件%
ping localhost>>123.txt %将ping命令的结果写入123.txt%
::@echo 按任意键结束 & pause > nul
@set /p="按任意键结束" < nul & pause > nul
3、PAUSE
--暂停指令, 显示提示内容并暂停的2中方式.
echo 您的提示语 & pause > nul, 其中光标在下一行.
@set /p=”您的提示语” < nul & pause > nul, 其中光标在本行.
4、ERRORLEVEL
--程序返回码, 可以利用echo %errorlevel%查看每个语句的返回码,默认值为0,一般情况下出错为1.
eg:
//getCurrentDate.bat
@echo off
::开启延时加载
setlocal enabledelayedexpansion
::
set date=%date:~0,10%
set date=!date:-=!
::echo !date!
exit /b !date!
//callBat.bat
call getCurrentDate.bat
echo %errorlevel%
::@echo 按任意键结束 & pause > nul
@set /p="按任意键结束" < nul & pause > nul
5、TITLE
--设置cmd窗口的标题. Tile yourTitle, 然后窗口标题就变了.
6、COLOR
--设置默认控制台前景和背景颜色. 命令格式: color [attr], 其中attr是有2个16进制数字指定,第一个数字表示前景色, 第二个数字表示背景色. 每个数字的取值如下:
0=黑色 8=灰色
1=蓝色 9=浅蓝色
2=绿色 A=淡绿色
3=湖蓝色 B=淡浅绿色
4=红色 C=淡红色
5=紫色 D=淡紫色
6=黄色 E=淡黄色
7=白色 F=亮白色
若没有指定任何参数, 则会采用CMD启动时的颜色, 这个值来自CMD窗口或者注册表. 若前景色和背景色颜色相同, 则因出错会使errorlevel值为1.
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 和 :
--跳转指令, 用来跳转到”:”表示的标号处并执行标号后的指令. for命令循环有一个缺点,就是整个循环被当作一条命令语句,涉及到变量延迟的问题, 而利用goto语句和条件判断可以实现条件循环.
eg:
@echo off
:Start
set %errorlevel%=0 %重置errorlevel的值%
set /p num=请输入一个整数(退出请按0)_
echo 您的输入为:%num%
if "%num%"=="0" (
GOTO Exit
)
set /a num = %num% %% 2
if %errorlevel% GTR 0 (
echo 您的输入有误!
GOTO Start
)
if {%num%}=={0} (
echo 您输入了一个偶数
) else (
echo 您输入了一个奇数
)
echo.
GOTO Start
:Exit
eg2:
@echo off
set var=0
rem ************循环开始了
:continue
set /a var+=1
echo 第%var%次循环
if %var% lss 100 goto continue
rem ************循环结束了
echo 循环执行完毕
pause
9、FIND、FINDSTR
--Find指令用于在文件中查找指定的字符串, 示例格式: find “searchStr” D:\test\123.txt.
--FindStr指令是Find指令的扩展, 其可以从文件、其他指令的输出内容中查找字符串.
Find和FindStr的却别用途:
a. 可以找出行数.
b. 可以读取Unicode格式的文本, 而Findstr不行.
c. 可以过滤特殊字符, 而findstr不行, 如: fsutil fsinfo drivers|find /v “”
d. 注意Findstr中可以使用的正则表达式的字符范围:
.通配符:任何字符
*重复:以前零次或多次出现的字符或类
^行中的位置:行首
$行中的位置:行尾
[class]字符类:集中的任何一个字符
[^class]反向类:非集中的任何一个字符
[X-y]范围:指定范围内的任何字符
\X转义:元字符 X 的文字用途
\<xyz字的位置:字首
xyz\>字的位置:字尾
其中, <和\>是单词锚定 ^是行首 $是行尾. 别把^,$和\<,\>弄混了一个是行一个是字。行开始与结束没什么好说的。而字的开始和结束就不一样了,例如:
1.txt里两行为"abcd" 和 "abcd e"用命令findstr "cd\>" 1.txt 两行都会出现,只要是连在一起(没被空格开)的并以cd结尾的(不要求是行尾)都满足。相当于文本中出现英语中以cd结尾的的单词了的行都会输出来。
eg:
//d:\test\123.txt内容
abcd
bda
adc
dfdg
!@#
sad
jljlAdsf
AAd ddA
$#@
123""456
dsfasfd"sdfds"asfads
//Find、FindStr指令的脚本示例内容
@echo off
echo ###Find指令示例###
find "a" D:\test\123.txt %查找含有a的整行内容%
find "a" /off D:\test\123.txt %不要跳过具有脱机属性(offline)集的文件%
find /i "a" D:\test\123.txt %查找含有a的整行内容, 并忽略大小写%
find /c "a" D:\test\123.txt %查找含有a的内容行数%
find /n "a" D:\test\123.txt %查找含有a的整行内容和行号%
find /v "a" D:\test\123.txt %查找不含有a的整行内容%
echo.
echo bdsadcds|find "a" %从前一条命令中查找含有a的内容%
find "a" D:\test\123.txt|find "s" %先查找含有a的整行内容, 再在其中查找含有s的整行内容%
find """" D:\test\123.txt %查找单个双引号的整行内容, 其中单个双引号被转义%
echo.
find """""" D:\test\123.txt %查找含有两个连续双引号的整行内容, 注意转义的双引号%
echo.
fsutil fsinfo drives|find /v ""
echo.
echo.
echo ###Findstr指令示例###
findstr "a" D:\test\123.txt %查找含有a的整行内容%
echo.
echo.
findstr "a @" D:\test\123.txt %查找含有a或b的整行内容%
echo.
echo.
findstr /c:"d d" D:\test\123.txt %查找含有'd d'的整行内容%
echo.
findstr /b "a" D:\test\123.txt %查找以a开头的的整行内容%
echo.
findstr /e "a" D:\test\123.txt %查找以a结尾的整行内容%
echo.
findstr /l """ D:\test\123.txt %按原搜索串查询, 即双引号中的内容看做原始字符串而非特殊符号%
echo.
echo.
findstr /r "^[1-9]*..[1-9]*$" D:\test\123.txt %将搜索串作为正则表达式查找匹配内容%
echo.
findstr /s "a" D:\test\*.* %在当前目录和所有子目录匹配含有搜索串的文件%
echo.
echo.
findstr /i "a" D:\test\123.txt %查找含有a的整行内容, 且不区分大小写%
echo.
echo.
findstr /x "adc" D:\test\123.txt %完全匹配, 即匹配整行而非关键字%
echo.
findstr /v "a" D:\test\123.txt %不匹配, 即查找不含有a的整行内容%
echo.
findstr /n "a" D:\test\123.txt %查找含有a的整行内容并显示其行号%
echo.
echo.
findstr /m "a" D:\test\*.txt %查找含有字符串a的文件的名称%
echo.
findstr /o "a" D:\test\*.txt %查找含有字符串a的整行内容, 以及该行内容之前有多少个字符(不可见的回车符占2个字符)%
echo.
echo.
findstr /p "a" D:\test\*.txt %忽略含有不可打印字符的文件%
echo.
echo.
findstr /g:D:\test\str.txt D:\test\123.txt %从123.txt中搜索含有str.txt中的字符串的整行内容%
echo.
echo.
findstr /a:1a "a" D:\test\12*.txt %当被搜索文件名中含有通配符*或?时, 查找含有字符串a的整行内容并以指定颜色显示文件名%
echo.
echo.
findstr /f:D:\test\list.txt "a" %从list.txt中提取文件列表, 然后搜索含有字符串a的整行的内容%
echo.
findstr /D:D:\test\;D:\test1\ "a" *.txt %以分号分隔的指定目录下, 搜索所有的txt文件并查找含有a的整行内容%
echo.
echo.
findstr /off "a" D:\test\*.txt %查找含有a的整行内容, 不跳过脱机文件%
::@echo 按任意键结束 & pause > nul
@set /p="按任意键结束" < nul & pause > nul
10、START 、直接运行和 CALL
--调用外部程序的命令.
a. Start、Call和直接运行外部程序的区别:
直接运行外部程序, 批处理会等待外部程序执行完在继续往后执行.
Start外部程序, 批处理会调起外部程序后, 不等待, 继续往后执行.
Call用来调用另外一个批处理或者该批处理内的命令段, 执行完毕后返回继续执行.
b. Call命令调用另外的批处理文件时, 必须以.bat或者.cmd作为命令的结尾. 若调用批处理自身所包含的命令段(相当于子程序), 则命令段以:label开头, 以goto :eof结尾.
此外,call也能直接运行变量中的命令, 如call %var%, 而var的值为echo 123.
注意:
在子程序段中,参数%0指标签:label.
主程序最后要加上exit或跳转语句,避免错误的进入子过程。
子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。
c. 批处理脚本中的%n表示所有的参数(如:%1、%2、%3…%n), 其中%0表示批处理脚本本身, 而%*则表示一次返回所有参数, 不用再一一返回.
批处理参数的扩展:
%~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 可以被其他有效数值替换。
注意:%~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*使用, 参数扩充时不理会参数所代表的文件是否真实存在,均以当前目录进行扩展.
eg:
@echo off
explorer d: %启动explorer并且完毕后才继续向下执行%
start explorer d: %启动explorer并继续向下执行%
echo ###CALL指令示例###
set /p Answer=是否调用脚本本身(y or n)?
if {%Answer%}=={n} (
GOTO SecondPart
) else (
call %0 %调用脚本本身%
)
:SecondPart
echo ###批处理参数扩展示例####
@echo off>D:\test\tmp.txt %产生一个临时文件%
Call :sub D:\test\tmp.txt
Del D:\test\tmp.txt
::@echo 按任意键结束 & pause > nul
@set /p="按任意键结束" < nul & pause > nul
: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
:Exit
exit
eg2:
@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
11、assoc 和 ftype
--assoc设置'文件扩展名'关联,关联到'文件类型'.
--ftype 设置'文件类型'关联,关联到'执行程序和参数'.
a. 文件关联过程:当你双击一个.txt文件时,windows先判断.txt属于 txtfile '文件类型', 再调用 txtfile 关联的命令行 txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1 打开文件.
可以在"文件夹选项"→"文件类型"里修改这2种关联
assoc #显示所有'文件扩展名'关联
assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile
assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile
ftype #显示所有'文件类型'关联
ftype exefile #显示exefile类型关联的命令行,结果显示 exefile="%1" %*
assoc .txt=Word.Document.8 #设置.txt为word类型的文档
assoc .txt=txtfile #恢复.txt的正确关联
ftype exefile="%1" %* #恢复 exefile 的正确关联
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令
12、pushd 和 popd
--切换目录相关的命令. 可以理解为一个存放目录的堆栈. 一般用处不大,在当前目录名不确定时,会有点帮助。(dos编程中很有用)
eg:
@echo off
c: & 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、shift
--更改批处理文件中可替换参数的位置.该命令从第 n 个参数开始移位;n 介于零和八之间。如: SHIFT /2会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。
14、IF
--条件判断语句,其语法格式如下([/I]表示忽略大小写):
IF [/I] [NOT] ERRORLEVEL number command
IF [/I] [NOT] string1==string2 command
IF [/I] [NOT] EXIST filename command
下面逐一介绍,更详细的分析请看后面章节。
(1) IF [NOT] ERRORLEVEL number command
IF ERRORLEVEL这个句子必须放在某一个命令的后面,执行命令后由IF ERRORLEVEL 来判断命令的返回值。Number的数字取值范围0~255,判断时值的排列顺序应该由大到小。返回的值大于等于指定的值时,条件成立.
(2) IF [NOT] string1==string2 command
检测当前变量的值做出判断,为了防止字符串中含有空格,可用以下格式:
if [NOT] {string1}=={string2} command
if [NOT] [string1]==[string2] command
if [NOT] "string1"=="string2" command
==等判断符号, 还可以用以下字符表示:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
(3) IF [NOT] EXIST filename command
文件或目录是否存在的意思.以上的IF语句也可以采用如下的格式:
IF EXIST filename (
del filename
) ELSE (
echo filename missing
)
也可写成:if exist filename (del filename) else (echo filename missing)
eg:
@echo off
dir c:
rem退出代码为>=1就跳至标题1处执行,>=0就跳至标题0处执行
IF ERRORLEVEL 1 goto 1
IF ERRORLEVEL 0 goto 0
:0
echo 命令执行成功!
Rem 程序执行完毕跳至标题exit处退出
goto exit
:1
echo 命令执行失败!
Rem 程序执行完毕跳至标题exit处退出
goto exit
:exit
pause
Echo ###Exsit File示例###
IF EXIST autoexec.bat echo 文件存在!
IF not EXIST autoexec.bat echo 文件不存在!
15、setlocal 与 变量延迟
-- setlocal 用于开启变量延迟等功能, 其指令为: setlocal enabledelayedexpansion, 并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果.
a.批处理运行命令的机制:
批处理读取命令时是按行读取的(另外例如for命令等,用圆括号括起来的语句也当作一行处理),在处理之前要完成必要的预处理工作,即:先把这整句读取并对变量赋值,那么变量在预处理时就已经被替换为具体的值了.而批处理设计的变量延迟就是为了能够感知环境变量的动态变化。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。
b. 当因为未开启变量延迟而现实”echo处于关闭状态”的提示, 即表示没有感知到语句中的动态变化。
c. 不开启延迟加载时, 可不用临时变量就能交换两个变量的值.
eg:
@echo off
echo ###未开启变量延迟###
set a=4
set a=5 & echo %a% %显示结果是4%
echo.
echo ###开启变量延迟###
setlocal enabledelayedexpansion
set a=4
set a=5 & echo !a! %显示结果是4%
echo.
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!
)
::若不开启延迟变量则会变成"Echo处理关闭状态", 未感知到动态变化.
echo.
echo ###不开启延迟加载时, 可不用临时变量就能交换两个变量的值###
setlocal disabledelayedexpansion
set var1=abc
set var2=123
echo 交换前: var1=%var1% var2=%var2%
set var1=%var2% & set var2=%var1%
echo 交换后: var1=%var1% var2=%var2%
::@echo 按任意键结束 & pause > nul
@set /p="按任意键结束" < nul & pause > nul
16、set命令
-- set指令常用来用来给系统变量或自定义变量赋值. 其还包括以下用法;
eg:
@echo off
::开启延时加载
setlocal enabledelayedexpansion
echo ###设置变量的值###
set var=holla %设置变量的值%
echo !var!
echo.
echo ###通过用户输入设置变量的值###
set /p var=请输入您的年龄(按回车结束):
echo 您的年龄是!var!岁
echo.
echo ###通过数学表达式作为变量的值###
set /a var=1+2+3*5
echo 1+2+3*5的结果为: !var!
echo.
set /a var1=1+1,var2=2+1,var3=3+1
echo !var1 !var2! !var3! %运行后会显示所有的结果%
echo.
echo 对于逻辑或、取余、与等操作, 需要用双引号括起来
set /a var1=1"&"1 %与运算%
set /a var2=1"+"1 %异运算%
set /a var3=3%2 %取模运算%
set /a var4=4"<<"3 %4乘以2的3次方运算%
set /a var5+=3 %自加3%
set /a var6”&=”1 %等于var6=var6”&”1的操作%
echo !var1! !var2! !var3! !var4! !var5! !var6!
echo.
set /p var="Hello, "<nul %第一回用户输入, nul表示自动输入空%
set /p var="Jim."<nul %第二回用户输入也同一行%
echo.
echo ###替换变量值的内容###
set oldVar=Holla , @!
set newVar=%oldVar:@=Jim% %替换字符串的内容%
echo !newVar!
echo.
echo ###字符串截取###
set newVar=%oldVar:~0,5% %其中len可以为负数%
echo !newVar!
echo.
::@echo 按任意键结束 & pause > nul
@set /p="按任意键结束" < nul & pause > nul
值得注意的是:
a. 关于set /a计算的数学表达式, 其支持的运算符有:
() :分组
!、~、- :一元运算符
*、/、% :算数运算符
+、- :算数运算符
<<、>> :逻辑移位
& :按位“与”
^ :按位“异”
| :按位“或”
=、*=、/= :赋值
%=、+=、-= :赋值
&=、^=、|= :赋值
<<=、>>= :赋值
, :表达式分隔符
b. 关于%var:str1=str2%变量替换操作的扩展操作为:
%var: =% %替换var中的空格为空, 注意等号前面有空格%
c. 关于%var:~start,len%字符串截取操作, start开始位置, 从0开始算. len为正数, 从左往右数len个, len为负数则为从最右端往左数len个.
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 也处理文件夹。
eg:
@echo off
md autorun
attrib +a +s +h autorun %然后将其设为存档、系统、隐藏属性%
特殊指令:
有时写批处理需要用到退格符,要在记事本里输入退格符可以采用以下方法:
方法1:首先进入CMD,然后输入EDIT回车,按Ctrl+P+BackSpace,就能得到一个退格符,可以复制粘贴至记事本
方法2:在记事本中按Ctrl+BackSpace,得到一个退格符(看着和空格一样)
三、常见的批处理特殊符号
符号清单:
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、@ : 关闭当前行的回显。
ECHO OFF可以关闭掉整个批处理命令的回显,但不能关掉ECHO OFF这个命令本身,现在我们在ECHO OFF这个命令前加个@,就可以达到所有命令均不回显的要求
2、% 批处理变量引导符,严格来说不算命令,它只是批处理中的参数而已(多个%一起使用的情况除外,以后还将详细介绍)。
引用变量用%var%,调用程序外部参数用%1至%9等等
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*为命令行传递给批处理的参数
%0 批处理文件本身,包括完整的路径和扩展名
%1 第一个参数
%9 第九个参数
%* 从第一个参数开始的所有参数
参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。
小技巧:添加行内注释
%注释内容%(可以用作行内注释,不能出现重定向符号和管道符号)
为什么这样呢?此时“注释内容”其实被当作变量,其值是空的,故只起注释作用,不过这种用法容易出现语法错误,一般不用。
eg:
copy %0 d:\wind.bat %最简单的复制文件自身的方法%
3、> 重定向符, 输出重定向命令. 这个字符的意思是传递并且覆盖,他所起的作用是将运行的结果传递到后面的范围(后边可以是文件,也可以是默认的系统控制台).
注意: 在NT系列命令行中,重定向的作用范围由整个命令行转变为单个命令语句,受到了命令分隔符&,&&,||和语句块的制约限制。
eg:
echo hello >1.txt %将建立文件1.txt,内容为”hello “(注意行尾有一空格)%
echo hello>1.txt %将建立文件1.txt,内容为”hello“(注意行尾没有空格)%
4、>> 重定向符, 输出重定向命令.这个符号区别于>,他的作用是传递并在文件的末尾追加,而>是覆盖.
eg:
echo hello > 1.txt %1.txt中显示hello%
echo world >>1.txt %1.txt的第二行追加world%
5、<、>&、<& 重定向符, 这三个命令也是管道命令, 其中<是输入重定向命令,从文件中读取命令输入; >&是将左侧句柄的输出写入到右侧句柄的输入中; <&是从右侧句柄中读取输出并将其写入到左侧的句柄输入中。
其中常用的句柄:0、1、2,未定义句柄:3—9. 其中的1与2都是代表某个数据流输入输出的地址(NT CMD 称之为句柄,MSDOS称之为设备)。
1>nul 表示禁止输出正确的信息。
2>nul 表示禁止输出错误信息。
句柄0:标准输入stdin,键盘输入
句柄1:标准输出stdout,输出到命令提示符窗口(console,代码为CON)
句柄2:标准错误stderr,输出到命令提示符窗口(console,代码为CON)
其中的stdin可被<重定向,stdout可被>、>>重定向。
例如: ipconfig >mylog.txt 2>&1指令中, 表示将ipconfig操作结果发送到mylog.txt中并同时将错误信息也发送到mylog.txt中.类似指令的结果通过”%>”的形式来定向输出, %表示文件描述, 1为标准输出, 2为标准错误输出. 系统默认%的值为1, 也就是”1>”(简写为”>”). StdOut的默认目标是终端, stderr的默认目标也是终端. 这也解释了为什么在批处理直接输入echo hello>log.txt, 控制台会显示echo hello 1>log.txt
eg:
@echo off
echo 2005-05-01>temp.txt
date <temp.txt %这样就可以不等待输入直接修改当前日期%
echo.
rem 采用简便方法从文本中读取第一行的代码
set /p str=<temp.txt
echo %str%
del temp.txt
pause
@echo on
ipconfig >mylog.txt 2>&1 %命令结果和错误信息都写入mylog.txt中%
Rem 演示加句柄的区别
ipconfig >mylog.txt %结果直接写入mylog%
ipconfig >mylog.txt 2>&1 %结果直接写入mylog%
ipconfiiig >mylog.txt %出现错误, 错误信息显示在控制台,而文本中未写入任何内容%
ipconfiiig >mylog.txt 2>&1 %出现错误,但控制台不显示,错误信息直接写入文本中%
pause
6、| 命令管道符, 将第一条命令的结果作为第二条命令的参数来使用,在unix中很常见。
格式:第一条命令 | 第二条命令 [| 第三条命令...]
eg:
@echo off
dir c:\|find "txt" %从dir的结果中查找txt字符串%
echo y|chkdsk a: /s /q /v:system %在出现确认提示时,自动输入Y%
7、^ 转义字符, ^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号当成符号而不使用他们的特殊意义。
eg:
@echo off
echo test ^>1.txt %test > 1.txt%
Rem转义字符让行尾的回车符失效了,从而起到了续行的作用
echo 英雄^
是^
好^
男人
pause
8、组合命令, 可以把多个命令组合起来当一个命令来执行, 批处理认行不认命令数目。
注意: 组合命令和重定向命令一起使用时的优先级: 管道命令 > 重定向命令 > 组合命令.
a. & 组合命令: 该符号表示当第一个命令执行失败了,后边的命令依然会循序从前往后执行。
语法:第一条命令 & 第二条命令 [& 第三条命令...]
b. && 组合命令: 当某一条命令执行出错时将不执行后面的命令,否则会一直执行完所有命令.
语法:第一条命令 && 第二条命令 [&& 第三条命令...]
c. || 组合命令: 当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不在向后执行命令,如果没有出现正确的命令则一直执行完所有命令.
语法:第一条命令 || 第二条命令 [|| 第三条命令...]
eg:
dir z:\ & dir y:\ & dir c:\ %连续显示z,y,c盘的内容, 不管该盘是否存在%
dir z:\ && dir y:\ && dir c:\ %连续显示z,y,c盘内容, 若不存在则不继续执行%
dir c:\ && dir d:\ > a.txt %a.txt只显示d盘的文件内容%
dir c:\ > a.txt && dir d:\ >> a.txt %a.txt显示c盘、d盘的文件内容%
dir c:\ > a.txt & dir d:\ >> a.txt %若c盘不存在, 也会继输出d盘的内容%
dir c:\;d:\ >>a.txt %也可以输出c和d盘的文件内容%
9、"" 字符串界定符, 双引号允许在字符串中包含空格.
eg:
@echo off
cd "program files" %进入program files目录%
cd progra~1 %进入program files目录%
cd pro* %进入program files目录%
10、, 逗号. 在某些情况下“,”可以用来当做空格使
eg:
@echo off
dir,c:\ %,号代替空格使用%
11、; 分号,用于在命令相同时,用来分隔不同目标, 且执行效果不变.如执行过程中发生错误,则只返回错误报告,但程序仍会执行。
eg:
rem如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行。
dir c:\;d:\;e:\;z:\ %以上命令相当于dir c:\, dir d:\, dir e:\...%
dir c:\
dir d:\
dir e:\
dir f:\
echo.
dir c:\;d:\;e:\1.txt
12、() 括号, 括号中可以包括多行命令,这些命令将视为一条命令行。括号在for语句和if语句中常见,用来嵌套使用循环或条件语句,其实括号()也可以单独使用。
eg:
@echo off
echo 1 & echo 2 & echo 3
rem 等同于下面的写法, 但要注意变量延迟的问题
(
echo 1
echo 2
echo 3
)
13、! 感叹号, 在变量延迟问题中,用来表示变量,即%var%应该表示为!var!。
四、for命令详解
a. 基本格式:FOR %%variable IN (set) DO cmd [cmd-params]
b. /D格式:FOR /D %%variable IN (set) DO cmd [cmd-params]
c. /R格式:FOR /R [[drv:]path] %%variable IN (set) DO cmd [cmd-params]
d. /L格式:FOR /L %%variable IN (start,step,end) DO cmd [cmd-params]
e. /F格式:FOR /F [“options”] %%variable IN (set) DO cmd [cmd-params]
FOR /F [“options”] %%variable IN ("string") DO cmd [cmd-params]
FOR /F [“options”] %%variable IN ('cmd') DO cmd [cmd-params]
其中,/D指定与目录名匹配, /R指定与path为根的目录树迭代匹配目录名(若set为单点”.”字符,则枚举该目录树; 若path为空则为当前目录), /L指定与增量形式从开始到结束的数字序列, /F根据给定的令牌选项使用文件解析来处理命令输出、字符串及文件内容(注意: 在没有使用tokens=选项时, /F将只检查第一个匹配的值).
参数
%%variable 指定一个单一字母表示可替换的参数。
(set) 指定一个或一组文件,可以使用通配符(* 和 ?)。
(“string”) 指定一个字符串, 当存在usebackq选项时, 参数形式为(‘string’)。
(‘cmd’) 指定一个命令语句,当存在usebackq选项时, 参数以”波浪号的点”区分(`cmd`)。
cmd 指定对每个文件执行的命令。
cmd-params为特定命令指定参数或命令行开关。
注意: 关于/F格式时, “options”的可选参数如下:
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了默认的分隔符(默认为空格和跳格键)。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身,并且会导致额外变量名
称的分配。
m-n格式为一个范围。通过 nth 符号指定 mth。
如果符号最后是一个星号(*),那么多余%%j,%%k等变量将在末尾的符号解析
之后依次给剩余变量赋予剩余的匹配文本(并且不能超过31个字段).
usebackq - 使用后引号(跟波浪号在一起的按键`)。
未使用参数usebackq时:file-set表示文件,但不能含有空格, 双引号
"string"表示字符串, 单引号'command'表示执行命令.
使用参数usebackq时:file-set和"file- set"都表示文件, 双引号可用于含空
格的情况.单引号'string'表示字符串,后引号`command`表示命令执行.
注意: FOR命令中的%%I变量扩展格式
~I - 删除任何引号("),扩展 %I
%~fI - 将 %I 扩展到一个完全合格的路径名
%~dI - 仅将 %I 扩展到一个驱动器号
%~pI - 仅将 %I 扩展到一个路径
%~nI - 仅将 %I 扩展到一个文件名
%~xI - 仅将 %I 扩展到一个文件扩展名
%~sI - 扩展的路径只含有短名
%~aI - 将 %I 扩展到文件的文件属性
%~tI - 将 %I 扩展到文件的日期/时间
%~zI - 将 %I 扩展到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名
称。如果环境变量名未被定义,或者没有找到文件,此扩展到空字符串.
eg:
@echo off
echo ###显示Test目录下的文件###
for %%i in (D:\test\*) do (
echo %%i
)
echo.
echo ###1. 显示Test目录下的目录###
for /d %%i in (D:\*) do (
echo %%i
)
echo.
::只查找1-4个字符的文件夹
for /d %%i in (D:\????) do (
echo %%i
)
echo.
echo ###2. 递归显示Test目录下的文件###
::含有通配符, 则递归过程中会匹配通配符
for /r d:\test\ %%i in (*.txt) do (
echo %%i
)
echo.
::不含通配符, 递归过程中汇忽略set指定的文件是否存在
for /r d:\test %%i in (d:\test\123.txt) do (
echo %%i
)
echo.
::只列举存在的文件
for /r d:\ %%i in (d:\test\123.txt) do (
if exist %%i echo %%i
)
echo.
::/r后不含目录, 则默认为当前目录
for /r %%i in (d:\test\123.txt) do (
echo %%i
)
echo.
echo ###3.以增量形式表示的从开始到结束的数字序列###
for /l %%i in (1,2,10) do (
echo %%i
)
echo.
::执行2次
for /l %%i in (1,2,5) do (
start explorer d:\
)
echo.
echo ###4. 使用文件解析来处理命令输出、字符串及内容###
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
::将每行第一段、第三段和剩余字段分别赋予变量%%i、%%j、%%k
::以逗号、减号和空格作为分隔符(空格必须放在最后)
for /F "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do (
echo %%i %%j %%k
)
Pause
Del test.txt
echo.
::显示123.txt的全部内容, 包括注释行.
for /f "eol= delims=" %%i in (d:\test\123.txt) do (
echo %%i
)
echo.
::不加tokens则默认只显示第一列
for /f "delims=" %%i in ('net user') do (
echo %%i
)
echo.
echo ###For语句中的扩展变量###
::开头有引号则删首位引号, 开头无引号则不删.(无头不删,有头连尾删)
for /f "delims=" %%i in (d:\test\123.txt) do (
echo %%~i
)
echo.
::%%~fi将文件名扩展为完全路径.
::%%~di将文件名扩展为一个驱动器号.
::%%~pi将文件名扩展为仅包含路径.
::%%~ni打印文件名.
::%%~xi打印文件的扩展名.
::%%~si打印文件的绝对短文件名.
::%%~ai打印文件的属性.
::%%~ti打印文件的建立日期.
::%%~zi打印文件的大小.
for /f "delims==" %%i in ('dir /b') do (
echo %%~fi
echo %%~di
echo %%~pi
echo %%~ni
echo %%~xi
echo %%~si
echo %%~ai
echo %%~ti
echo %%~zi
)
echo.
::%%~$PATH:i在path变量里搜索内容, 如果有则打印绝对路径, 否则打印错误.
for /f "delims=" %%i in ("notepad.exe") do (
echo %%~$Path:i
)
echo.
::@echo 按任意键结束 & pause > nul
@set /p="按任意键结束" < nul & pause > nul
五、批处理中的特殊变量(包括本地变量、系统变量)
本地变量和系统变量的值由系统将其根据事先定义的条件自动赋值我们只需要调用而以.
%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。
%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。
%CD% 本地 返回当前目录字符串。
%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
%DATE% 系统 返回当前日期(与date /t格式相同)。
%ERRORLEVEL% 系统 返回上一条命令的错误代码,通常用非零值表示错误。
%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。
%HOMEPATH% 系统 返回用户主目录的完整路径。
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。
%LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
%OS% 系统 返回操作系统名称。Win2K显示为 Windows_NT。
%PATH% 系统 指定可执行文件的搜索路径。
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系(x86 或 Itanium).
%PROCESSOR_IDENTIFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 系统 返回处理器的版本号。
%PROMPT% 本地 返回当前解释程序的命令提示符设置。
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。
%SYSTEMDRIVE% 系统 返回系统根目录的驱动器.
%SYSTEMROOT% 系统 返回系统根目录的位置。
%TEMP%和%TMP% 系统和用户 返回当前登录用户的应用程序的默认临时目录。
%TIME% 系统 返回当前时间(与time /t格式相同)。
%USERDOMAIN% 本地 返回包含用户帐户的域的名称。
%USERNAME% 本地 返回当前登录的用户的名称。
%USERPROFILE% 本地 返回当前用户的配置文件的位置。
%WINDIR% 系统 返回操作系统目录的位置。
这么多系统变量,我们如何知道他的值是什么呢?
在CMD里输入 echo %WINDIR%
这样就能显示一个变量的值了!
举个实际例子,比如我们要复制文件到当前帐号的启动目录里就可以这样
copy d:\1.bat "%USERPROFILE%\「开始」菜单\程序\启动\"
%USERNAME% 本地 返回当前登录的用户的名称。 注意有空格的目录要用引号引起来
六、交互设计的菜单界面:
eg:
@echo off
cls
title 终极多功能修复
:menu
cls
color 0A
echo.
echo ==============================
echo 请选择要进行的操作,然后按回车
echo ==============================
echo.
echo 1.网络修复及上网相关设置,修复IE,自定义屏蔽网站
echo.
echo 2.病毒专杀工具,端口关闭工具,关闭自动播放
echo.
echo 3.清除所有多余的自启动项目,修复系统错误
echo.
echo 4.清理系统垃圾,提高启动速度
echo.
echo Q.退出
echo.
echo.
:cho
set choice=
set /p choice= 请选择:
IF NOT "%choice%"=="" SET choice=%choice:~0,1%
if /i "%choice%"=="1" goto ip
if /i "%choice%"=="2" goto setsave
if /i "%choice%"=="3" goto kaiji
if /i "%choice%"=="4" goto clean
if /i "%choice%"=="Q" goto endd
echo 选择无效,请重新输入
echo.
goto cho
七、常用示例:
1). 用ftp命令实现自动下载:
--介绍如何用dos命令行调用ftp命令,实现ftp自动登录,并上传下载,并自动退出ftp程序。
其实可以将ftp命令组合保存为一个文本文件,然后用以下命令调用即可。
ftp命令的格式:
ftp -n -s:[[drive:]path]filename
上面的filename为ftp命令文件,包括登录IP地址,用户名、密码、操作命令等
eg:
open 90.52.8.3 #打开ip
user iware #用户为iware
password8848 #密码
bin #二进制传输模式
prompt
cd tmp1 #切换至iware用户下的tmp1目录
pwd
lcd d:\download #本地目录
mget * #下载tmp1目录下的所有文件
bye #退出ftp
2).用7-ZIP实现命令行压缩和解压功能
语法格式:
7z <command> [<switch>...] <base_archive_name> [<arguments>...]
7z.exe的每个命令都有不同的参数<switch>,请看帮助文件
<base_archive_name>为压缩包名称
<arguments>为文件名称,支持通配符或文件列表
其中,7z是至命令行压缩解压程序7z.exe,<command>是7z.exe包含的命令,列举如下:
a: Adds files to archive. 添加至压缩包
a命令可用参数:
-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. 从压缩包中删除文件
d命令可用参数:
-i (Include)
-m (Method)
-p (Set Password)
-r (Recurse)
-u (Update)
-w (Working Dir)
-x (Exclude)
e: Extract解压文件至当前目录或指定目录
e命令可用参数:
-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用文件的完整路径解压至当前目录或指定目录
x命令可用参数:
-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)
3). 调用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 语法和有效的宿主参数。
4).将批处理转化为可执行文件:
如果将批处理文件转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。Bat2Com就可以完成这个转换工作。
小知识:在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同的这四类文件,当只键入文件名时,DOS执行的是name.com,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。
这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS窗口的命令行中,用法:Bat2Com
FileName,这样就会在同一目录下生成一个名为FileNme.com的可执行文件,执行的效果和原来的.bat文件一样。
5).时间延迟:
什么是时间延迟?顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。
延迟的应用见下节:“模拟进度条”。
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
6).模拟进度条
下面给出一个模拟进度条的程序。如果将它运用在你自己的程序中,可以使你的程序更漂亮。
@echo off
mode con cols=113 lines=15 &color 9f
cls
echo.
echo 程序正在初始化. . .
echo.
echo ┌──────────────────────────────────────┐
set/p= ■<nul
for /L %%i in (1 1 38) do set /p a=■<nul&ping /n 1 127.0.0.1>nul
echo 100%%
echo └──────────────────────────────────────┘
pause
解说:“set /p a=■<nul”的意思是:只显示提示信息“■”且不换行,也不需手工输入任何信息,这样可以使每个“■”在同一行逐个输出。“ping /n 0 127.1>nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。
7.)特殊字符的输入及应用
开始 -> 运行 -> 输入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=床前明月光<nul
::显示文字,光标停于行尾
ping -n 0 127.0.0.1>nul
::设置延迟时间
set /p a=<nul
:: 输出一些退格符将光标置于该行的最左端(退格符的数量可以自己调整)。
set /p a= <nul
::输出空格将之前输出的文字覆盖掉。
set /p a=<nul
::再次输出退格符将光标置于该行的最左端,这里的退格符数量一定不能比前面的空格数少。
::否则光标不能退到最左端。
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 依次取出变量char中的每一个字符,并显示。
ping -n 0 127.0.0.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= <nul
set /p a=<nul
ping /n 0 127.0.0.1>nul
set /p a=%1<nul
)
::文字闪动
goto :eof
8.)随机数(%random%)的应用技巧
%RANDOM% 系统变量 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
2的15次方等于32768,上面的0~32767实际就是15位二进制数的范围。
那么,如何获取100以内的随机数呢?很简单,将%RANDOM%按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
::---------生成随机密码
::---------%1为密码长度,%2及以后为返回变量名称
::---------for命令最多只能区分31个字段
@echo off
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
说明:本例涉及到变量嵌套和命令嵌套的应用,见后。
9.)变量嵌套 与 命令嵌套
和其它编程语言相比,dos功能显得相对简单,要实现比较复杂的功能,需要充分运用各种技巧,变量嵌套与命令嵌套就是此类技巧之一。
先复习一下前面的“字符串截取”的关键内容:
**********************************************
截取功能统一语法格式为:%a:~[m[,n]]%
**********************************************
方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)。
百分号如果需要当成单一字符,必须写成%%
以上是dos变量处理的通用格式,如果其中的m、n为变量,那么这种情况就是变量嵌套了。
比如设变量word为“abcdefghij”,变量num为“123456789”
%word:~4,1%为e,其中4可以从变量num中取值,即%num:~3,1%,写成组合形式如下:
%word:~%num:~3,1%,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
请按任意键继续. . .
八、自己写的功能Bat程序
//Win2K3、Win2K8安装.netFramework3.5
@echo off
::==========>>>dotNet3.5sp1离线包的安装过程<<<==========
::
::开启延时加载
setlocal enabledelayedexpansion
::(1.1)设置安装文件目录及备份注册表信息
set errorCode=0
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set instPath=!currPath!CN_DotNetFx35sp1_x86_x64_K3K8\
::
::echo %currPath%
::echo %instPath%
::echo %errorCode%
::
echo 正在安装.Net Framework 3.5 Sp1,安装完成后将会自动退出。
echo 安装需要5~10分钟,请您耐心等待...
!instPath!dotNetFx35setup.exe /QB /norestart
exit /b
// Win2K8R2安装.netFramework3.5
@echo off
::==========>>>dotNet3.5sp1安装过程<<<==========
echo 正在安装.Net Framework 3.5 Sp1,安装完成后将会自动退出。
echo 安装需要5~10分钟,请您耐心等待...
start /w pkgmgr /iu:NetFx2-ServerCore;NetFx2-ServerCore-WOW64;NetFx3-ServerCore;NetFx3-ServerCore-WOW64;
exit /b
//Win2K3、Win2K8、Win2K8R2安装.netFramework4.0
@echo off
::==========>>>dotNet4.0Full离线包的安装过程<<<==========
::
::开启延时加载
setlocal enabledelayedexpansion
::(1.1)设置安装文件目录及备份注册表信息
set errorCode=0
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set instPath=!currPath!CN_DotNetFx40_x86_x64_K3K8K8r2\
::
::echo %currPath%
::echo %instPath%
::echo %errorCode%
::
echo 正在安装.Net Framework 4.0 Full,安装完成后将会自动退出。
echo 安装需要5~10分钟,请您耐心等待...
!instPath!dotNetFx40_Full_x86_x64.exe /passive /norestart
exit /b
//Win2K3安装IIS6.0
@echo off
::==========>>>IIS6.0的安装过程<<<==========
echo 正在安装(IIS6.0)Internet Information Service,安装完成后将会自动退出。
echo 安装需要1~3分钟,请您耐心等待...
::
::开启延时加载
setlocal enabledelayedexpansion
::(1.1)设置安装文件目录及备份注册表信息
set errorCode=0
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set instPath=!currPath!CN_IIS60_X86_K3\
set exptPath=!currPath!iislog.txt
::
@echo off>!exptPath!
echo [%date:~0,10% %time:~0,8%] 开始安装IIS6.0...>>!exptPath!
echo 安装路径:!instPath!>>!exptPath!
echo 日志路径:!exptPath!>>!exptPath!
::
::echo %currPath%
::echo %instPath%
::echo %errorCode%
::
::备份原系统的Windows安装文件的路径
echo [%date:~0,10% %time:~0,8%] 备份原系统的Windows安装文件的路径>>!exptPath!
echo Windows Registry Editor Version 5.00 >!currPath!srcregbak.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup] >>!currPath!srcregbak.reg
for /f "tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup /v ServicePackSourcePath') do (
set result=%%i
set result=!result:\=\\!
echo "ServicePackSourcePath"="!result!"
) >>!currPath!srcregbak.reg
for /f "tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup /v SourcePath') do (
set result=%%i
set result=!result:\=\\!
echo "SourcePath"="!result!"
) >>!currPath!srcregbak.reg
echo [%date:~0,10% %time:~0,8%] 备份完毕>>!exptPath!
::
::通过生成reg文件, 更改Windows安装文件的默认路径
echo [%date:~0,10% %time:~0,8%] 更改Windows安装文件的默认路径>>!exptPath!
echo Windows Registry Editor Version 5.00 >!currPath!setupreg.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup] >>!currPath!setupreg.reg
echo "ServicePackSourcePath"="!instPath:\=\\!" >>!currPath!setupreg.reg
echo "SourcePath"="!instPath:\=\\!" >>!currPath!setupreg.reg
::
::reg文件生成成功
if %ERRORLEVEL% GTR 0 (set errorCode=IIS-INST-[1]&&goto end)
::(1.2)导入注册表设置后, 删除临时文件
regedit /S !currPath!setupreg.reg
::del !currPath!setupreg.reg
echo [%date:~0,10% %time:~0,8%] 默认路径修改完毕>>!exptPath!
::
if %ERRORLEVEL% GTR 0 (set errorCode=IIS-INST-[2]&&goto end)
::
echo [%date:~0,10% %time:~0,8%] 正在生成配置文件...>>!exptPath!
::(1.3)生成IIS无人值守安装选项文件
echo [Components] > !currPath!iis.txt
echo iis_common = ON >> !currPath!iis.txt
echo iis_www = ON >> !currPath!iis.txt
echo iis_www_vdir_scripts = ON >> !currPath!iis.txt
echo iis_asp = ON >> !currPath!iis.txt
echo iis_inetmgr = ON >> !currPath!iis.txt
echo aspnet= ON >> !currPath!iis.txt
::
echo [%date:~0,10% %time:~0,8%] 配置文件生成完毕>>!exptPath!
if %ERRORLEVEL% GTR 0 (set errorCode=IIS-INST-[3]&&goto end)
::
echo [%date:~0,10% %time:~0,8%] 执行安装...>>!exptPath!
::(1.4)执行IIS安装
Sysocmgr.exe /i:sysoc.inf /u:!currPath!iis.txt
::del !currPath!\iis.txt
::
echo [%date:~0,10% %time:~0,8%] 安装执行完毕>>!exptPath!
::echo IIS6安装完毕
::
if %ERRORLEVEL% GTR 0 (set errorCode=IIS-INST-[4]&&goto end)
::
echo [%date:~0,10% %time:~0,8%] 还原Windows默认安装文件路径...>>!exptPath!
::(1.5)恢复原系统的Windows安装文件的路径
regedit /S !currPath!srcregbak.reg
::del !currPath!\srcregbak.reg
echo [%date:~0,10% %time:~0,8%] 默认路径已还原>>!exptPath!
::
if %ERRORLEVEL% GTR 0 (set errorCode=IIS-INST-[5]&&goto end)
::
:end
::echo !errorCode! > !currPath!result.txt
echo [%date:~0,10% %time:~0,8%] 正在清除临时文件...>>!exptPath!
regedit /S !currPath!srcregbak.reg
del !currPath!setupreg.reg /q
del !currPath!iis.txt /q
del !currPath!srcregbak.reg /q
echo [%date:~0,10% %time:~0,8%] 已成功安装IIS6.0>>!exptPath!
::
:end
exit /b !errorCode!
//Win2K3删除IIS6.0
@echo off
::==========>>>IIS6.0的卸载过程<<<==========
echo 正在卸载(IIS6.0)Internet Information Service,安装完成后将会自动退出。
echo 安装需要1~3分钟,请您耐心等待...
::
::开启延时加载
setlocal enabledelayedexpansion
::(1.0)设置安装文件目录及备份注册表信息
set errorCode=0
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set exptPath=!currPath!iislog.txt
::
@echo off>!exptPath!
echo [%date:~0,10% %time:~0,8%] 开始卸载IIS6.0...>>!exptPath!
::echo %currPath%
::echo %errorCode%
echo [%date:~0,10% %time:~0,8%] 正在生成配置文件...>>!exptPath!
::
::(1.1)生成IIS无人值守安装选项文件
echo [Components] > !currPath!iis.txt
echo iis_common = OFF >> !currPath!iis.txt
echo iis_www = OFF >> !currPath!iis.txt
echo iis_www_vdir_scripts = OFF >> !currPath!iis.txt
echo iis_asp = OFF >> !currPath!iis.txt
echo iis_inetmgr = OFF >> !currPath!iis.txt
echo aspnet= OFF >> !currPath!iis.txt
::
echo [%date:~0,10% %time:~0,8%] 配置文件生成完毕>>!exptPath!
if %ERRORLEVEL% GTR 0 (set errorCode=IIS-UNINST-[1]&&goto end)
::
echo [%date:~0,10% %time:~0,8%] 执行卸载...>>!exptPath!
::(1.2)执行IIS安装
Sysocmgr.exe /i:sysoc.inf /u:!currPath!iis.txt
::del !currPath!\iis.txt
echo [%date:~0,10% %time:~0,8%] 卸载执行完毕>>!exptPath!
::
if %ERRORLEVEL% GTR 0 (set errorCode=IIS-UNINST-[2]&&goto end)
::
:end
::echo !errorCode! > !currPath!\result.txt
echo [%date:~0,10% %time:~0,8%] 正在清除临时文件...>>!exptPath!
del !currPath!iis.txt /q
echo [%date:~0,10% %time:~0,8%] 已成功卸载IIS6.0>>!exptPath!
::
:end
exit /b !errorCode!
//Win2K8安装IIS7.0
@echo off
::==========>>>IIS7.0安装过程<<<==========
echo 正在安装(IIS7.0)Internet Information Service,安装完成后将会自动退出。
echo 安装需要1~3分钟,请您耐心等待...
::
::开启延时加载
setlocal enabledelayedexpansion
::(1.1)设置安装文件目录及备份注册表信息
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set exptPath=!currPath!iislog.txt
::
@echo off>!exptPath!
echo [%date:~0,10% %time:~0,8%] 开始安装IIS7.0...>>!exptPath!
echo 日志路径:!exptPath!>>!exptPath!
::
echo [%date:~0,10% %time:~0,8%] 执行安装...>>!exptPath!
::
start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;WAS-WindowsActivationService;WAS-ProcessModel;IIS-FTPServer;WAS-NetFxEnvironment;WAS-ConfigurationAPI;IIS-FTPManagement;IIS-FTPPublishingService;IIS-ManagementConsole;IIS-LegacySnapIn
::
echo [%date:~0,10% %time:~0,8%] 已成功安装IIS7.0>>!exptPath!
::
exit /b
//Win2K8卸载IIS7.0
@echo off
::==========>>>IIS7.0卸载过程<<<==========
echo 正在卸载(IIS7.0)Internet Information Service,安装完成后将会自动退出。
echo 安装需要1~3分钟,请您耐心等待...
::
::开启延时加载
setlocal enabledelayedexpansion
::(1.1)设置安装文件目录及备份注册表信息
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set exptPath=!currPath!iislog.txt
::
@echo off>!exptPath!
echo [%date:~0,10% %time:~0,8%] 开始卸载IIS7.0...>>!exptPath!
echo 日志路径:!exptPath!>>!exptPath!
::
echo [%date:~0,10% %time:~0,8%] 执行卸载...>>!exptPath!
::
start /w pkgmgr /uu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;WAS-WindowsActivationService;WAS-ProcessModel;IIS-FTPServer;WAS-NetFxEnvironment;WAS-ConfigurationAPI;IIS-FTPManagement;IIS-FTPPublishingService;IIS-ManagementConsole;IIS-LegacySnapIn
::
echo [%date:~0,10% %time:~0,8%] 已成功卸载IIS7.0>>!exptPath!
::
exit /b
//Win2K8R2安装IIS7.5
@echo off
::==========>>>IIS7.5安装过程<<<==========
echo 正在安装(IIS7.5)Internet Information Service,安装完成后将会自动退出。
echo 安装需要1~3分钟,请您耐心等待...
::
::开启延时加载
setlocal enabledelayedexpansion
::(1.1)设置安装文件目录及备份注册表信息
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set exptPath=!currPath!iislog.txt
::
@echo off>!exptPath!
echo [%date:~0,10% %time:~0,8%] 开始安装IIS7.5...>>!exptPath!
echo 日志路径:!exptPath!>>!exptPath!
::
echo [%date:~0,10% %time:~0,8%] 执行安装...>>!exptPath!
::
START /w PKGMGR /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-CGI;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;WAS-WindowsActivationService;WAS-ProcessModel;IIS-FTPServer;IIS-FTPSvc;IIS-FTPExtensibility;IIS-WebDAV;WAS-NetFxEnvironment;WAS-ConfigurationAPI
::
echo [%date:~0,10% %time:~0,8%] 已成功安装IIS7.5>>!exptPath!
::
exit /b
//Win2K8R2 卸载IIS7.5
@echo off
::==========>>>IIS7.5卸载过程<<<==========
echo 正在卸载(IIS7.5)Internet Information Service,安装完成后将会自动退出。
echo 安装需要1~3分钟,请您耐心等待...
::
::开启延时加载
setlocal enabledelayedexpansion
::(1.1)设置安装文件目录及备份注册表信息
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set exptPath=!currPath!iislog.txt
::
@echo off>!exptPath!
echo [%date:~0,10% %time:~0,8%] 开始卸载IIS7.5...>>!exptPath!
echo 日志路径:!exptPath!>>!exptPath!
::
echo [%date:~0,10% %time:~0,8%] 执行卸载...>>!exptPath!
::
START /w PKGMGR /uu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-CGI;IIS-ASPNET;IIS-NetFxExtensibility;IIS-ASP;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementConsole;IIS-ManagementScriptingTools;IIS-ManagementService;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-LegacySnapIn;WAS-WindowsActivationService;WAS-ProcessModel;IIS-FTPServer;IIS-FTPSvc;IIS-FTPExtensibility;IIS-WebDAV;WAS-NetFxEnvironment;WAS-ConfigurationAPI
::
echo [%date:~0,10% %time:~0,8%] 已成功卸载IIS7.5>>!exptPath!
::
exit /b
//重新注册ASP.Net到IIS
@echo off
::==========>>>注册DotNet到IIS中<<<==========
::
::开启延时加载
setlocal enabledelayedexpansion
::(1.1)设置安装文件目录
set /p sysBit=请输入当前操作系统的位数(x86 or x64):
set /p frmVer=请输入要使用的DotNetFramework版本(2.0、3.0、3.5 or 4.0):
::
echo 即将在!sysBit!系统中应用DotNet框架版本!frmVer!
echo 正在为IIS重新注册Asp.Net...
echo 注册过程需要1~2分钟,注册完成后会自动退出,请耐心等候...
::
set baseFrmPath=
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
if {!frmVer!}=={3.0} (
set frmVer=v3.0
) else if {!frmVer!}=={3.5} (
set frmVer=v3.5
) else if {!frmVer!}=={4.0} (
set frmVer=v4.0.30319
) else (
set frmVer=v2.0.50727
)
::
if {!sysBit!}=={x64} (
set baseFrmPath=%windir%\Microsoft.NET\Framework64\!frmVer!\
) else (
set baseFrmPath=%windir%\Microsoft.NET\Framework\!frmVer!\
)
::重新注册DotNet到IIS
if {"!baseFrmPath!"} NEQ {""} (
!baseFrmPath!aspnet_regiis -i
)
::
exit /b
//MySql安装过程
::(4.1)拷贝默认的数据文件
xcopy !instPath!dataBak\Origin\data !instPath!data /I /E /Y
echo [%date:~0,10% %time:~0,8%] 文件拷贝完成>>!exptPath!
::
echo [%date:~0,10% %time:~0,8%] 正在生成配置文件my.ini...>>!exptPath!
::(4.2)生成my.ini
call !instPath!mysqlConf\mysqlconf.bat !instPath! !instPath!
::
echo [%date:~0,10% %time:~0,8%] 配置文件生成完成>>!exptPath!
::(4.3)安装Mysql
echo [%date:~0,10% %time:~0,8%] 尝试卸载现有的Mysql服务...>>!exptPath!
net stop mysql
!instPath!bin\mysqld.exe --remove mysql
::
echo [%date:~0,10% %time:~0,8%] 卸载服务尝试完成>>!exptPath!
::
echo [%date:~0,10% %time:~0,8%] 正在安装Mysql服务...>>!exptPath!
::
!instPath!bin\mysqld.exe --install mysql --defaults-file="!instPath!my.ini"
::
echo [%date:~0,10% %time:~0,8%] 服务安装完成>>!exptPath!
::
if %ERRORLEVEL% GTR 0 (set errorCode=Mysql-INST-[1]&&goto end)
::
::(4.2)启动Mysql服务并修改Mysql密码
::echo !uPass!
echo [%date:~0,10% %time:~0,8%] 正在启动Mysql服务并修改root用户密码...>>!exptPath!
net start mysql
!instPath!bin\mysql -uroot -e "update mysql.user set password=PASSWORD('!uPass!') where User='root'; flush privileges;"
::
echo [%date:~0,10% %time:~0,8%] Mysql服务已启动>>!exptPath!
if %ERRORLEVEL% GTR 0 (set errorCode=Mysql-INST-[2]&&goto end)
::
::(4.3)修改系统Path路径,添加Mysql路径
echo [%date:~0,10% %time:~0,8%] 正在修改操作系统Path环境变量...>>!exptPath!
call !instPath!mysqlConf\SysPath.bat !instPath!bin /add
::
::(4.4)Flush系统Path路径, 达到不重启直接是Path路径生效
call !instPath!mysqlConf\flushPath.exe
echo [%date:~0,10% %time:~0,8%] Path环境变量修改完成>>!exptPath!
echo [%date:~0,10% %time:~0,8%] Mysql5.1.58已成功安装>>!exptPath!
::
:end
exit /b !errorCode!
//卸载Mysql
@echo off
::==========>>>Mysql的卸载过程<<<==========
::
::开启延时加载
setlocal enabledelayedexpansion
set uPass=
::设置安装文件目录
set errorCode=0
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set instPath=!currPath!Mysql501058\
set exptPath=!currPath!mysqllog.txt
::获取windows根目录
cd /d %windir%
cd\
set sysDrvLetter=%cd%
::
::
::echo %errorCode%
::echo %currPath%
::echo %instPath%
::echo %sysDrvLetter%
::
::
echo [%date:~0,10% %time:~0,8%] 开始卸载Mysql5.1.58...>>!exptPath!
echo [%date:~0,10% %time:~0,8%] 正在备份现有数据文件...>>!exptPath!
::(4.1)备份现有数据文件
call !instPath!mysqlConf\getTimestampDir.bat
set dirName=%errorlevel%
::echo !dirName!
::创建以时间为名称的备份目录
mkdir !instPath!dataBak\!dirName!
::
::(4.2)卸载Mysql
echo [%date:~0,10% %time:~0,8%] 正在停止Mysql服务...>>!exptPath!
net stop mysql
::备份数据文件
move /y !instPath!data !instPath!dataBak\!dirName!
echo [%date:~0,10% %time:~0,8%] 数据文件备份完成>>!exptPath!
::
::卸载mysql
echo [%date:~0,10% %time:~0,8%] 正在执行卸载...>>!exptPath!
!instPath!bin\mysqld.exe --remove mysql
::
if %ERRORLEVEL% GTR 0 (set errorCode=Mysql-UNINST-[1]&&goto end)
::
::(4.3)修改系统Path路径,添加Mysql路径
echo [%date:~0,10% %time:~0,8%] 正在修改系统Path环境变量...>>!exptPath!
call !instPath!mysqlConf\SysPath.bat !instPath!bin /del
::
::(4.4)Flush系统Path路径, 达到不重启直接是Path路径生效
call !instPath!mysqlConf\flushPath.exe
::
echo [%date:~0,10% %time:~0,8%] Path环境变量修改完成>>!exptPath!
echo [%date:~0,10% %time:~0,8%] Mysql5.1.58已成功卸载>>!exptPath!
::
:end
exit /b !errorCode!
//配置MySql
@echo off
::生成fcgiext.ini文件
::开启延时加载
setlocal enabledelayedexpansion
set exptPath=%1
set mysqlPath=%2
::echo !exptPath!
::echo !mysqlPath!
::
del !exptPath!my.ini /q
@echo off>!exptPath!my.ini
set tmpStr=
for /f "tokens=* eol=" %%i in (!exptPath!mysqlConf\mysqlOrigin.ini) do (
set tmpStr=%%i
if "!tmpStr!" == "datadir=" (
set tmpStr=!tmpStr! "!mysqlPath!data"
)
if "!tmpStr!" == "slow_query_log_file=" (
set tmpStr=!tmpStr! "!mysqlPath!log\slow.log"
)
echo !tmpStr!
)>>!exptPath!my.ini
::
::
exit /b
//获取时间戳
@echo off
::生成fcgiext.ini文件
::开启延时加载
setlocal enabledelayedexpansion
::
set date=%date:~2,8%
set time=%time:~0,5%
set date=!date:-=!
set time=!time::=!
exit /b !date!!time!
//修改系统Path变量
@echo off
::==========>>>添加/删除系统Path变量的指定内容<<<==========
::开启延时加载
setlocal enabledelayedexpansion
set pathContent=%1
set opType=%2
::echo !pathContent!
::
::echo PATH=%path%
if not "!pathContent!"=="" (
set tmpStr=
set pathStr=
for %%i in (%path%) do (
set tmpStr=%%i
if {!tmpStr!} NEQ {!pathContent!} (
set pathStr=!pathStr!!tmpStr!;
)
)
if {!opType!}=={/add} (
set pathStr=!pathStr!!pathContent!;
)
set pathStr=!pathStr:~0,-1!
::WMIC首次使用会占用一定的初始化时间, 以下会永久改变path
::%windir%\system32\wbem\wmic.exe ENVIRONMENT where "name='path' and username='<system>'" set VariableValue='!pathStr!'
wmic ENVIRONMENT where "name='path' and username='<system>'" set VariableValue="!pathStr!"
::以下这个只能临时改变Path,不能永久改变
::set path="!pathStr!"
)
exit /b
//安装FastCgi
@echo off
::==========>>>PHP5.2.17的安装过程<<<==========
::
::开启延时加载
setlocal enabledelayedexpansion
::设置安装文件目录
set errorCode=0
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set instPath=!currPath!PHP502017\
set exptPath=!currPath!phplog.txt
::获取windows根目录
cd /d %windir%
cd\
set sysDrvLetter=%cd%
::
::echo %errorCode%
::echo %currPath%
::echo %instPath%
::echo %sysDrvLetter%
::
echo [%date:~0,10% %time:~0,8%] 开始安装PHP5.2.17...>>!exptPath!
echo [%date:~0,10% %time:~0,8%] 正在拷贝php支持文件...>>!exptPath!
::(2.1)拷贝php支持文件到System32目录
copy !instPath!winLib\*.* %windir%\System32\ /y
::
echo [%date:~0,10% %time:~0,8%] php支持文件拷贝完成>>!exptPath!
if %ERRORLEVEL% GTR 0 (set errorCode=PHP-INST-[1]&&goto end)
::
::(2.2)配置php.ini
echo [%date:~0,10% %time:~0,8%] 正在生成配置文件php.ini...>>!exptPath!
call !instPath!phpconf\phpconf.bat !instPath! !instPath!
echo [%date:~0,10% %time:~0,8%] php.ini配置文件生成完毕>>!exptPath!
::
::(2.3)配置FastCgi15的支持
echo [%date:~0,10% %time:~0,8%] 正在安装FastCgi1.5...>>!exptPath!
call !currPath!\FastCgi15\FastCgi15_x86_K3_add.bat !currPath!\FastCgi15\ !instPath!
echo [%date:~0,10% %time:~0,8%] FastCgi1.5安装完毕>>!exptPath!
echo [%date:~0,10% %time:~0,8%] PHP5.2.17已成功安装>>!exptPath!
:end
exit /b !errorCode!
//卸载FastCgi
@echo off
::==========>>>PHP5.2.17的卸载过程<<<==========
::
::开启延时加载
setlocal enabledelayedexpansion
::设置安装文件目录
set errorCode=0
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set instPath=!currPath!PHP502017\
set exptPath=!currPath!phplog.txt
::获取windows根目录
cd /d %windir%
cd\
set sysDrvLetter=%cd%
::
::echo %errorCode%
::echo %currPath%
::echo %instPath%
::echo %sysDrvLetter%
::
echo [%date:~0,10% %time:~0,8%] 开始卸载PHP5.2.17...>>!exptPath!
echo [%date:~0,10% %time:~0,8%] 正在删除php支持文件...>>!exptPath!
::(2.1)从System32目录删除php支持文件
del %windir%\System32\libeay32.dll /q
del %windir%\System32\libmcrypt.dll /q
del %windir%\System32\libmysql.dll /q
del %windir%\System32\ssleay32.dll /q
if %ERRORLEVEL% GTR 0 (set errorCode=PHP-INST-[1]&&goto end)
::
::(2.2)卸载fastcgi15支持
echo [%date:~0,10% %time:~0,8%] 正在卸载FastCgi1.5...>>!exptPath!
call !currPath!\FastCgi15\FastCgi15_x86_K3_del.bat !currPath!\FastCgi15\
echo [%date:~0,10% %time:~0,8%] FastCgi1.5卸载完毕>>!exptPath!
::
echo [%date:~0,10% %time:~0,8%] PHP5.2.17已成功卸载>>!exptPath!
:end
exit /b !errorCode!
//配置FastCgi
@echo off
::生成fcgiext.ini文件
::开启延时加载
setlocal enabledelayedexpansion
set exptPath=%1
set phpPath=%2
::echo !exptPath!
::echo !phpPath!
::设置安装文件目录
cd /d !exptPath!
cd..
set currPath=%cd%
::echo !currPath!
::
del !exptPath!fcgiext.ini /q
@echo off>!exptPath!fcgiext.ini
for /f "tokens=* eol=" %%i in (!currPath!\conf\fcgiext_Orign.ini) do (
echo %%i
)>>!exptPath!fcgiext.ini
echo php^=PHP >>!exptPath!fcgiext.ini
echo.>>!exptPath!fcgiext.ini
echo [PHP] >>!exptPath!fcgiext.ini
echo ExePath^=!phpPath!php-cgi.exe >>!exptPath!fcgiext.ini
::
::
exit /b
//IIS6.0修改ScriptMaps
@echo off
::==========>>>IIS60_应用程序扩展映射的删除<<<==========
::开启延时加载
setlocal enabledelayedexpansion
set exptPath=%1
set opType=%2
::echo !exptPath!
::注册默认的脚本宿主为: Cscript
wscript //b //h:cscript
::
::附加.php应用程序扩展映射
::(1.1)用iiscnfg导出IIS的配置文件
iiscnfg /export /f !exptPath!IISConfigBak.xml /sp /lm/w3svc
::
::(1.2)获取SessionKey的值
for /f "tokens=*" %%i in ('findstr "SessionKey\=\".*\"" !exptPath!IISConfigBak.xml') do (
set sessionKey=%%i
set sessionKey=!sessionKey:SessionKey=!
set sessionKey=!sessionKey:"=!
)
::去掉=号
for /f "delims==" %%i in ("!sessionKey!") do (
set sessionKey=%%i
)
::echo !sessionKey!
::(1.3)替换掉iisphpconf中的SessionKey字符串, 并添加.php映射
if {!opType!} == {/add} (
call !exptPath!conf\iisphpconf.bat !exptPath!IISConfig.xml !sessionKey! /add
) else (
call !exptPath!conf\iisphpconf.bat !exptPath!IISConfig.xml !sessionKey! /del
)
::
::(1.4)用iiscnfg将iisconfig.xml导入IIS
iiscnfg /import /f !exptPath!iisconfig.xml /sp /lm/w3svc /dp /lm/w3svc /merge
::
::(1.5)删除IISConfigBak.xml文件和IISConfig.xml文件
del !exptPath!IISConfigBak.xml /q
del !exptPath!IISConfig.xml /q
::
::将默认的脚本宿主程序恢复为:WScript
wscript //b //h:wscript
//安装Php
@echo off
::==========>>>PHP5.2.17的安装过程<<<==========
::
::开启延时加载
setlocal enabledelayedexpansion
::设置安装文件目录
set errorCode=0
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set instPath=!currPath!PHP502017\
set exptPath=!currPath!phplog.txt
::获取windows根目录
cd /d %windir%
cd\
set sysDrvLetter=%cd%
::
::echo %errorCode%
::echo %currPath%
::echo %instPath%
::echo %sysDrvLetter%
::
echo [%date:~0,10% %time:~0,8%] 开始安装PHP5.2.17...>>!exptPath!
echo [%date:~0,10% %time:~0,8%] 正在拷贝php支持文件...>>!exptPath!
::(2.1)拷贝php支持文件到System32目录
copy !instPath!winLib\*.* %windir%\System32\ /y
::
echo [%date:~0,10% %time:~0,8%] php支持文件拷贝完成>>!exptPath!
if %ERRORLEVEL% GTR 0 (set errorCode=PHP-INST-[1]&&goto end)
::
::(2.2)配置php.ini
echo [%date:~0,10% %time:~0,8%] 正在生成配置文件php.ini...>>!exptPath!
call !instPath!phpconf\phpconf.bat !instPath! !instPath!
echo [%date:~0,10% %time:~0,8%] php.ini配置文件生成完毕>>!exptPath!
::
::(2.3)配置FastCgi15的支持
echo [%date:~0,10% %time:~0,8%] 正在安装FastCgi1.5...>>!exptPath!
call !currPath!\FastCgi15\FastCgi15_x86_K3_add.bat !currPath!\FastCgi15\ !instPath!
echo [%date:~0,10% %time:~0,8%] FastCgi1.5安装完毕>>!exptPath!
echo [%date:~0,10% %time:~0,8%] PHP5.2.17已成功安装>>!exptPath!
:end
exit /b !errorCode!
//卸载Php
@echo off
::==========>>>PHP5.2.17的卸载过程<<<==========
::
::开启延时加载
setlocal enabledelayedexpansion
::设置安装文件目录
set errorCode=0
set currPath=%cd%
set endFlag=!currPath:~-1!
if {!endFlag!}=={\} (
set currPath=!currPath!
) else (
set currPath=!currPath!\
)
set instPath=!currPath!PHP502017\
set exptPath=!currPath!phplog.txt
::获取windows根目录
cd /d %windir%
cd\
set sysDrvLetter=%cd%
::
::echo %errorCode%
::echo %currPath%
::echo %instPath%
::echo %sysDrvLetter%
::
echo [%date:~0,10% %time:~0,8%] 开始卸载PHP5.2.17...>>!exptPath!
echo [%date:~0,10% %time:~0,8%] 正在删除php支持文件...>>!exptPath!
::(2.1)从System32目录删除php支持文件
del %windir%\System32\libeay32.dll /q
del %windir%\System32\libmcrypt.dll /q
del %windir%\System32\libmysql.dll /q
del %windir%\System32\ssleay32.dll /q
if %ERRORLEVEL% GTR 0 (set errorCode=PHP-INST-[1]&&goto end)
::
::(2.2)卸载fastcgi15支持
echo [%date:~0,10% %time:~0,8%] 正在卸载FastCgi1.5...>>!exptPath!
call !currPath!\FastCgi15\FastCgi15_x86_K3_del.bat !currPath!\FastCgi15\
echo [%date:~0,10% %time:~0,8%] FastCgi1.5卸载完毕>>!exptPath!
::
echo [%date:~0,10% %time:~0,8%] PHP5.2.17已成功卸载>>!exptPath!
:end
exit /b !errorCode!
//配置Php
@echo off
::生成fcgiext.ini文件
::开启延时加载
setlocal enabledelayedexpansion
set exptPath=%1
set phpPath=%2
::echo !exptPath!
::echo !phpPath!
::
del !exptPath!php.ini /q
@echo off>!exptPath!php.ini
set tmpStr=
for /f "tokens=* eol=" %%i in (!exptPath!\phpconf\phpConfOrigin.ini) do (
set tmpStr=%%i
if "!tmpStr!" == "extension_dir =" (
set tmpStr=!tmpStr! "!phpPath!ext"
)
if "!tmpStr!" == "upload_tmp_dir =" (
set tmpStr=!tmpStr! "%windir%\Temp"
)
echo !tmpStr!
)>>!exptPath!php.ini
::
::
exit /b