批处理脚本

摘要:
这些命令统称为批处理命令。您可以按键盘上的Ctrl+C强制终止批处理的执行。在批处理中,将命令放在单引号中将执行命令,将命令放置在双引号中将将命令作为字符串读取。
常用dos命令

 批处理复制文件(文件夹)

1.复制C:ae.txt 文本文件到d:文件夹下面
【复制完的目录结构应该为d:e.txt】
xcopy /y c:ae.txt d: >nul
2.复制C:a文件夹及其内所有东西(包括隐藏,系统文件)到D:文件夹下面
【 a文件夹也要复制过去,也就是说,复制之后,a文件夹应该在b文件夹下】
xcopy /y /e /h c:a d:a >nul
3.复制C:a文件夹内的所有东西到D:文件夹下面
【a文件夹不复制过去,只是把c,d这两个文件夹和e.txt这个文件复制过去】
xcopy /y /e /h c:a d: >nul

批处理中cd进其他目录
加 /d参数就可以了。
cd /d d:

一、批处理基础

批处理是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT 或者CMD。这些命令统称批处理命令。

可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。

批处理命令不区分大小写。

命令不懂,直接在CMD下面输入: name /? 这样的格式来看系统给出的帮助文件,比如for /? 就会把FOR命令的帮助全部显示出来!

在批处理中,将命令放在单引号中命令会被执行,将命令放在双引号中,命令会被当成字符串读取。

DOS转义字符 

期望得到的字符转义后字符 
%%%May not always be required in doublequoted strings, just try
^^^May not always be required in doublequoted strings, but it won't hurt
&^&
<</code>^<</code>
>^>
|^|
'^'Required only in the FOR /F "subject" (i.e. between the parenthesis),unless backq is used
`^`Required only in the FOR /F "subject" (i.e. between the parenthesis), ifbackq is used
,^,Required only in the FOR /F"subject" (i.e. between the parenthesis), even in doublequoted strings
;^;
=^=
(^(
)^)
!^^!Required only when delayed variable expansionis active
\Required only in the regex pattern of FINDSTR
[[
]]
""

mkdir 目录名 创建目录
md 目录名 创建目录
rd 目录名 删除目录(用rd命令删除的目录必须是空的且不能删除根目录和当前目录)
rmdir 目录名 删除目录(用rd命令删除的目录必须是空的且不能删除根目录和当前目录)

copy 123 c:filename 创建一个文件,并同时添加一些内容
type nul >c:filename 创建一个空文件
echo. >c:filename 创建一个空文件
del c:filename 删除文件

 我们最好使用绝对路径去操作文件,以下是绝对路径的获取方式:
@echo off
echo 当前盘符:%~d0 
echo 当前盘符和路径:%~dp0 
echo 当前批处理全路径:%~f0 
echo 当前盘符和路径的短文件名格式:%~sdp0 
echo 当前CMD默认目录:%cd% 
pause

1、rem 和 ::

Rem为注释命令,rem后的内容不被执行,但能回显。

:: 为注释命令,  ::后的字符行执行时不会回显, 无论是否用echo on打开命令行回显。

2、echo和 @

(1)echo 信息内容   #输出提示信息  

(2)ECHO 文件内容>文件名  #建立新文件  

(3)ECHO 文件内容>>文件名  #增加文件内容  

(4)ECHO.   #输出空行,即相当于输入一个回车 。“.”要紧跟在 ECHO 后面中间不能有空格。 “.”可以用,:;/[]+等任一符号替代。 ECHO.输出的回车可以经DOS管道转向作为其它命令的输入,比如echo.|time相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS 提示符状态

(5)ECHO 答复语|命令文件名  #答复命令中的提问  

用于简化一些需要人机对话的命令的操作,它是通过 DOS 管道命令把 ECHO 命令的输出作为人机对话命令的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车:C:>ECHO Y|CHKDSK /F

(6)echo [{ on|off }]  #打开回显或关闭回显功能,echo off,能够关闭 DOS 提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。

(7)@放在命令前用于关闭该命令的回显,无论此时echo是否为打开状态。如果想关闭“echo off”命令行自身的显示,则需要在该命令行前加上“@”。

3、pause

pause,是暂停的意思就是停止系统命令的执行并显示 请按任意键继续. . .” 

4title  设置cmd窗口的标题

title 新标题       #可以看到cmd窗口的标题栏变了  

5、color

设置默认的控制台前景和背景颜色。 color [attr]

attr  指定控制台输出的颜色属性,颜色属性由两个十六进制数字指定,第一个为背景,第二个则为前景。例如: " color fc" 在亮白色上产生亮红色。如果没有给定任何参数,该命令会将颜色还原到 dos启动时的颜色。

     0 = 黑色        8 = 灰色

     1 = 蓝色        9 = 淡蓝色

     2 = 绿色        A = 淡绿色

     3 = 湖蓝色      B = 淡浅绿色

     4 = 红色        C = 淡红色

     5 = 紫色        D = 淡紫色      

    6 = 黄色        E = 淡黄色

    7 = 白色        F = 亮白色

6、goto和 :

goto跳转的意思,允许以“:XXX”来构建一个标签,然后用GOTO XXX跳转到标签:XXX处执行标签后的命令,标签的名字可以随便起,前加个冒号用来表示这个字符串是标签,goto命令就是根据这个冒号(:)来寻找下一步跳到到那里。如果不设结束条件,goto可以持续执行下去。 

@echo off

:start

Set /a var+=1

Echo %var%

If %var% leq 3 GOTO start

Pause

运行显示:

1

2

3

4

7、find 在文件中搜索字符串

find [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

   /V          显示所有未包含指定字符串的行。

   /C          仅显示包含字符串的行数。

   /N          显示行号。

   /I           搜索字符串时忽略大小写。

   "string"  指定要搜索的文字串,

   [drive:][path]filename             指定要搜索的文件。

如果没有指定路径find将搜索键入的文字或另一命令产生的文字。

8、type显示文本文件的内容

TYPE [drive:][path]filename   显示文本文件的内容

find常和type 命令结合使用

find "string"  filename

type [drive:][path]filename | find "string" [>tmpfile]  #挑选包含string的行

type [drive:][path]filename | find /v "string"            #剔除文件中包含string的行

type [drive:][path]filename | find /c                       #显示文件行数  

8、start 命令

调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况)

例:start explorer d:   调用图形界面打开D盘  

start xxx.bat   调用调用外部的一个批处理

9、call

call调用另一个批处理,当另一个批处理执行完后再继续执行原来的批处理

call [drive:][path]filename [batch-parameters] 调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。

call :label arguments 调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头以命令goto :eof结尾。   

例:

Set aa=123456

Set cmdstr=echo %aa%

Call %cmdstr%

Pause

本例中如果不用call,而直接运行%cmdstr%,将显示结果%aa%,而不是123456

10、setlocal 变量延迟  

变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来,否则就没有变量延迟的效果。

批处理读取命令时是按行读取的,在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。

 @echo off

 set a=4

 set a=5 & echo %a%

 Pause

结果:4

启动变量延迟后,就会得到正确答案。

 @echo off

 Setlocal enabledelayedexpansion

 Set a=4

 Set a=5 & echo !a!

 Pause  

结果:5

11、shift

shift [/n]  更改批处理文件中可替换参数的位置。

如果命令扩展名被启用,shift命令支持/n 命令行开关;该命令行开关告诉命令从第n个参数开始移位;n 介于零和8之间。例如:

 shift  /2 会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。  

12、% 变量引导符

1)引用变量用%var%

2)调用程序外部参数用%1 至%9、*%等。

%1 第一个参数,%9 第九个参数

%* 从第一个参数开始的所有参数参数

%0 批处理文件本身,包括完整的路径和扩展名。%0可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等。例:最简单的复制文件自身的方法

copy %0 d:wind.bat

@echo off

Echo %1 %2 %3 %4

Echo %1

Echo %2

Echo %3

Echo %4 

把上下面的代码保存为test.bat,然后输入 d: est.bat 我是第一个参数 我是第二个参数  我是第三个参数  我是第四个参数,注意中间的空格,我们会看到这样的结果:

我是第一个参数我是第二个参数我是第三个参数我是第四个参数

我是第一个参数

我是第二个参数

我是第三个参数

我是第四个参数

对比下代码,%1就是”我是第一个参数”  %2 就是”我是第二个参数”

@echo off
net user
%0

保存为BAT 执行,他就会无限循环执行net user这条命令,直到你手动停止.

13、|  命令管道符

格式:第一条命令 | 第二条命令 [| 第三条命令...]     将第一条命令的结果作为第二条命令的参数来使用管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令

dir c:|find "txt"    显示C:下的目录文件和子目录列表,并发现TXT字符串。

14、>   输出重定向

作用是将运行的结果传递到后面的范围(后可以是文件,也可以是默认的系统控制台)

15、>>  输出重定向

作用和>有点类似,但他们的区别是>>是传递并在文件的末尾追加,而>是覆盖

16、<  输入重定向

从文件中读入命令输入,而不是从键盘中读入。

@echo off

Echo 2005-05-01>temp.txt

Date <temp.txt

Del temp.txt

这样就可以不等待输入直接修改当前日期

17、>&、<& 重定向符

其中的stdin可被<重定向,stdout可被>、>>重定向。

> :代表重定向到哪里,例如:echo "123" > /home/123.txt
1 :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 :表示stderr标准错误
& :表示等同于的意思,2>&1,表示2的输出重定向等同于1

command >out.file 2>&1 &

command >out.file是将command的标准输出重定向到out.file文件(即输出内容不打印到屏幕上)。2>&1 是将标准错误重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个& , 是让该命令在后台执行。

17、^  转义字符

^是针对特殊符号<、>、&的前导字符,在命令中他将以上 3 个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。

比如

echo test ^>1.txt

结果则是:test > 1.txt

另外此转义字符还可以用作续行符号。因为每行末尾还有一个看不见的回车符,转义字符位于行尾时就让回车符失效了,从而起到了续行的作用。

18、&  组合命令

语法:第一条命令 & 第二条命令 [& 第三条命令...]

&为组合命令,可以把多个命令组合起来当一个命令来执行,当第一个命令执行失败了,也不影响后边的命令执行。

dir z: & dir y: & dir c:

以上命令会连续显示z,y,c盘的内容,不理会该盘是否存在  

19、&& 组合命令

语法:第一条命令 && 第二条命令 [&& 第三条命令...]

同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令。

  dir c: && dir d: > a.txt

这样执行后a.txt里只有D盘的信息!因为组合命令的优先级没有重定向命令的优先级高!所以这句在执行时将本行分成这两部分:dir c:和dir d: > a.txt

若要a.txt里有C、D盘,则必须得这么写: dir c: > a.txt && dir d: >> a.txt

20、||  组合命令

语法:第一条命令 || 第二条命令 [|| 第三条命令...]

可以同时执行多条命令,当一条命令失败后才执行第二条命令,若执行正确将不执行后面的命令。

21、""  字符串界定符

在批处理中,将命令放在单引号中命令会被执行,将命令放在双引号中,命令会被当成字符串读取。

双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法

cd "program files"

cd progra~1

cd pro*

以上三种方法都可以进入program files这个目录  

22、, 逗号

逗号相当于空格,在某些情况下“,”可以用来当做空格使

比如

dir,c:  

23、; 分号

当命令相同时可以将不同目标用;来隔离,且执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。

例:dir c:;d:;e:1.txt

以上命令相当于

Dir c:

Dir d:

Dir e:1.txt

其中文件e:1.txt不存在,但 e盘存在,有错误提示,但命令仍会执行。如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行。

24、() 括号

左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。括号在 for 语句和 if 语句中常见。

命令:echo 1 & echo 2 & echo 3

可以写成:

(

echo 1

echo 2

echo 3

)

上面两种写法效果一样,这两种写法都被视为是一条命令行。

注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题。

25、! 感叹号

在变量延迟问题中用来表示变量,即%var%应该表示为!Var!。

26、attrib显示或更改文件属性

attrib [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]

   +   设置属性。

   -    清除属性。

   R   只读文件属性。

   A   存档文件属性。

   S   系统文件属性。

   H   隐藏文件属性。

   [drive:][path][filename]  指定要处理的文件属性。

   /S  处理当前文件夹及其子文件夹中的匹配文件。

   /D  也处理文件夹。

例:

md autorun

attrib +a +s +h autorun

上面的命令将建立文件夹autorun,然后将其设为存档、系统、隐藏属性

27、pushd 和 popd

切换当前目录, 一般用处不大,在当前目录名不确定时,会有点帮助。(dos编程中很有用)

@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

28、assoc 和 ftype

Assoc 设置'文件扩展名'关联,关联到'文件类型'

Ftype 设置'文件类型'关联,关联到'执行程序和参数'

当你双击一个.txt文件时,windows 并不是根据.txt直接判断用notepad.exe打开,而是先判断.txt属于 txtfile '文件类型',再调用 txtfile关联的命令行 txtfile=%systemroot%system32NOTEPAD.EXE %1

可以在"文件夹选项"→"文件类型"里修改这 2 种关联

Assoc            #显示所有'文件扩展名'关联

Assoc .txt        #显示.txt'文件扩展名'关联

ftype            #显示所有'文件类型'关联

ftype exefile    #显示exefile 类型关联的命令行,结果显示 exefile="%1" %*  

Assoc .txt=Word.Document.8   设置.txt为 word类型的文档,可以看到.txt文件的图标都变了

Assoc .txt=txtfile    恢复.txt的正确关联  

Ftype exefile="%1" %*  恢复 exefile 的正确关联

二、批处理中的变量

批处理中的变量分为两类,分别为"系统变量"和"自定义变量"

1、系统变量

他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值, 不需要我们来给他赋值,我们只需要调用而以!

%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。

%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。

%CD% 本地 返回当前目录字符串。

%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。

%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。

%COMPUTERNAME%  系统 返回计算机的名称。

%COMSPEC%  系统 返回命令行解释器可执行程序的准确路径。

%DATE%  系统 返回当前日期。使用与 date /t 命令相同的格式。

%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% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。

%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。

%USERDOMAIN% 本地 返回包含用户帐户的域的名称。

%USERNAME% 本地 返回当前登录的用户的名称。

%USERPROFILE% 本地 返回当前用户的配置文件的位置。

%WINDIR% 系统 返回操作系统目录的位置。

2、自定义变量

自定义变量使用set命令SET [variable=[string]]
SET /?查看SET 的帮助 
SET #键入不带参数的set是显示当前环境变量
SET variable= #清除变量variable的值,使其变成未定义状态。
SET variable="" #此时变量值并不为空,而是等于两个引号,即""
SET /P variable=[promptstring] #提供一个交互界面,让用户自己输入变量的值
Set var=我是值 #Var为变量名,=号右变的是要给变量的值,这就是最简单的一种设置变量的方法了

在批处理中要引用变量就把var变量名用两个%扩起来:%var%

三、set命令

set命令除了可以设置自定义变量外还可以进行数学计算。

SET /A expression /A参数就是让SET 可以支持数学符号进行加减等一些数学运算!数字表达式以递减的优先权顺序支持下列操作(一般的运算常为十进制运算,如果数字字符串最左边为 0,将被认为是八进制,从而出错):
() -分组
! ~ - -一元运算符
* / % -算数运算符
+ - -算数运算符
<< >> -二进制逻辑移位
& -二进制按位“与”
^ -二进制按位“异”
| -二进制按位“或”
= *= /= %= += -= -算数赋值
&= ^= |= <<= >>= -二进制运算赋值
, -表达式分隔符

@echo off
Set /p input=请输入计算表达式:
Set /a var=%input%
Echo 计算结果:%input%=%var%
Pause
请输入计算表达式:1+9+20+30-10
计算结果:1+9+20+30-10=50
请按任意键继续. . .

DOS计算只能精确到32位,这个32位是指二进制32位,其中最高位为符号位(0 为正,1 为负),低位 31 位为数值。31 个 1 换成十进制为 2147483647,所以DOS 计算的有效值范围是-2147483648 至2147483647,超出该数值范围时计算出错

有时候我们需要直接在原变量进行加减操作就可以用这种语法 set /a var+=1即set /a var = %var% + 1。还有一些用逻辑或取余操作符,这些符号,按照上面的使用方法会报错的,对于这样的"逻辑或取余操作符",我们需要把他们用双引号引起来,也可以用转义字符^。
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

@echo off
Set /p n=请输入2的几次方:
Set /a num=1^<^<n
Echo %num%
Pause
运行结果:
请输入2的几次方: 3
8
请按任意键继续. . .

四、字符串的替换和截取

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"

字符串的替换和截取功能在引用变量的地方均可以,并不一定必须要有set命令
@echo off
Set a=bbs.verybat.cn
Echo 替换前的值: "%a%"
Echo 替换后的值: "%a:.=点%"
Pause

2、字符串截取

截取功能语法格式为:%a:~[m[,n]]% 。方括号表示可选,%为变量标识符,a 为变量名,冒号用于分隔变量名和说明部分,~可以简单理解为“偏移”,m为偏移量(缺省为0),n为截取长度(缺省为全部)

1)%PATH:~10,5% 就是显示变量PATH里从 11位(偏移量 10)开始的 5 个字符! :

截取功能例子1:

@echo off

Set a=bbs.verybat.cn

Set var=%a:~1,2%

Echo %var%

Pause

执行结果只显示为"bs"两个字母。

2)%PATH:~-10%

截取功能例子2:

@echo off

Set a=bbs.verybat.cn

Set var=%a:~-3%

Echo %var%

Pause

运行结果:.cn

这个就是把变量a倒数3位的值给变量VAR

截取功能例子3:

@echo off

Set a=bbs.verybat.cn

Set var=%a:~3%

Echo %var%

Pause

运行显示:.verybat.cn

这个就是把变量a的从第 3 位开始后面全部的值给变量VAR

3)%PATH:~0,-2%  

@echo off

Set a=bbs.verybat.cn

Set var=%a:~0,-3%

Echo %var%

Pause

运行显示:bbs.verybat

这是把变量a的值从0位开始, 到倒数第三位之间的值全部赋予给var  

五、for命令详解

1、基本格式

For %%variable IN (set) DO command [command-parameters]

参数:for有4 个参数  /d    /l    /r    /f   

  %%variable  可替换的参数。

  set指定一个或一组文件。可以使用通配符。 *号表示任意N 个字符,?号只表示任意一个字符

   Command    指定对每个文件执行的命令。

   Command-parameters  为特定命令指定参数或命令行开关。  

2/d  目录搜索

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

/d参数只能显示当前目录下的目录名字,这个参数主要用于目录搜索,不会搜索文件

1)@echo off

For /d %%i in (c:*) do echo %%i

Pause

运行会把C盘根目录下的全部目录名字打印出来,而文件名字一个也不显示!

2)@echo off

For /d %%i in (???) Do echo %%i

Pause

如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了

3/R 文件搜素

FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]

检查以 [drive:]path 为根的目录树,如果在/R后没有指定目录,则使用当前目录。把当前或者你指定路径下的文件名字全部读取

@echo off

For /r c: %%i in (*.exe) do echo %%i

Pause

这个会把 C 盘根目录,和每个目录的子目录下面全部的EXE文件都列出来!

4/L  数字序列

FOR /L %%variable IN (start,step,end) DO command [command-parameters]

使用迭代变量设置起始值 (Start#),然后以增量/减量形式逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)。

例如(1,1,5) 将产生序列1 2 3 4 5,(5,-1,1) 将产生 序列  (5 4 3 2 1)。

@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 窗口!

当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了!    

5/F  迭代及文件解析

“For /f”用来处理命令输出、字符串及文件内容,delims负责切分字符串,而tokens负责提取字符串。
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]
for /f "tokens=2 delims= " %%y IN ('adb shell "ps | grep com.tencent.mm"') do @set PID=%%

"options"包括一个或多个指定不同解析选项的关键字。这些关键字为:
Eol=c 一个行注释字符的结尾(就一个)
Skip=n 在文件开始时忽略的行数。
Delims=xxx 分隔符集。这个替换了空格和跳格键的默认分隔符集。
Tokens=x,y,m-n 每行的哪一个符号被传递到每个迭代的 for 本身。

delims 中可以设置空格和其他字符做分隔符:
"delims=;, " 以分号,逗号,空格做分隔符。连着写就行了,空格必须放最后。
分隔符有双引号的话,表达式"delims=tokens="就得去掉前后的双引号,写成delims=tokens=,并且该表达式中的所有符号都要转义,如:
for /f tokens^=1^,2^ delims^=^" %%a in (a.txt) do echo %%a %%b
(for中变量必须要用单个字母来表示,但只有一个写在in前,有多个变量值时,变量值对应的赋值给该字母变量后面的字母变量)

@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=,-     (减号后有一空格)以逗号减号和空格为分隔符,空格必须放在最后

六、if命令

1、IF

IF 条件判断语句有 3 种基本的用法,语法格式如下:
IF [NOT] ERRORLEVEL number command #如果返回值等于或大于指定数字,则执行命令
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command #如果指定的文件名存在,则执行命令

ELSE 子句必须在出现在 IF 之后的同一行上。例如:
IF EXIST filename (
Del filename
) ELSE (
Echo filename missing
)

2、IF [NOT] ERRORLEVEL number command

这个用法的基本做用是判断上一条命令执行结果的返回值,以决定下一个步骤。
IF ERRORLEVEL这个句子必须放在某一个命令的后面,执行命令后由IF ERRORLEVEL 来判断命令的返回值。
当使用 if errorlevel 0 …… 的句式时,它的含义是:如果错误码的值大于或等于0的时候,将执行某个操作;
当使用 if %errorlevel%==0 …… 的句式时,它的含义是:如果错误码的值等于 0 的时候,将执行某操作。

@echo off
net user
IF %ERRORLEVEL% == 0
echo net user 执行成功了!
Pause

这是个简单判断上条命令是否执行成功。一般上一条命令的执行结果代码只有两结果,"成功"用 0 表示   "失败"用 1表示。实际上,errorlevel返回值可以在0~255之间

@echo off
Set /p var=请输入命令:
%var%
If %ERRORLEVEL% == 0 (echo %var%执行成功了) ELSE echo %var%执行失败了!
Pause

当然我门还可以把if else这样的语句分成几行写出来:
@echo off
Set /p var=随便输入个命令:
%var%
If %ERRORLEVEL% == 0 (
Echo !Var! 执行成功了
) ELSE (
Echo 基本上执行失败了..
)
Pause

3、IF [NOT] string1==string2 command

用来比较变量或者字符的值是不是相等的。但是你如果输入相同的字符,但是如果其中一个后面打了一个空格, 这个例子还是会认为相等, 为了防止字符串中含有空格,可用以下格式

If [NOT] {string1}=={string2} command

If [NOT] [string1]==[string2] command

If [NOT] "string1"=="string2" command

IF [/I] string1 ==string2 command #参数/I表示不区分大小写

@echo off
If /i a == A (echo 我们相等) ELSE echo 我们不相等
Pause
加上/I不区分大小写就相等了!

4、IF [NOT] EXIST filename command

判断某个文件或者文件夹是否存在,如果路径有空格加个双引号就不会出现判断出错了!

@echo off
If exist "c: est" (echo 存在文件) else echo 不存在文件
Pause

批处理高级技巧

1、交互界面设计

看看高手设计的菜单界面吧:

@echo off

Cls

Title 终极多功能修复

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

  

2、循环语句

1、指定次数循环

FOR /L %variable IN (start,step,end) DO command [command-parameters]

组合命令:

FOR /L %variable IN (start,step,end) DO (

Command1

Command2

……

)  

3、条件循环

for命令循环有一个缺点,就是整个循环被当作一条命令语句,涉及到变量延迟的问题。 其实利用goto语句和条件判断可以实现条件循环:  

@echo off

Set var=0

Rem ************循环开始了

:continue

Set /a var+=1

Echo 第%var%次循环

If %var% lss 100 goto continue

Rem ************循环结束了

Echo 循环执行完毕

Pause

@echo off

Set var=100

Rem ************循环开始了

:continue

Echo 第%var%次循环

Set /a var-=1

If %var% gtr 0 goto continue

Rem ************循环结束了

Echo 循环执行完毕

Pause  

3、子程序

在批处理程序中可以调用外部可运行程序,比如 exe 程序,也可调用其他批处理程序,这些也可以看作子程序,但是不够方便。在 windows中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序后面。子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。 子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。传至子程序的参数在 call 语句中指定,子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量,请看下面的例子。

子程序例1:
@echo off
Call :sub return 你好
Echo 子程序返回值:%return%
Pause

:sub
Set %1=%2
Goto :eof
运行结果:你好

子程序例2:
@echo off
call :sub return 你好
echo 子程序返回值:%return%
pause

:sub
set %1=%2
goto :eof
运行结果:你好


子程序例3:设计一个求多个整数相加的子程序
@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

4、将批处理转化为可执行文件:

由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。Bat2Com 就可以完成这个转换工作。 这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS 窗口的命令行中,用法:Bat2Com Filename,这样就会在同一目录下生成一个名为 filenme.com 的可执行文件,执行的效果和原来的.bat文件一样。

DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同的这四类文件,当只键入文件名时,DOS执行的是name.com,如果需要执行其他三个文件,则必须指定文件的全名,如name.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毫秒

   请按任意键继续. . .

首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。

为了方便引用,可将上面的例子改为子程序调用形式:

@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

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%%

Pause

解说:

“set /p a=■<nul”的意思是:只显示提示信息“■”且不换行,也不需手工输入任何信息,这样可以使每个“■”在同一行逐个输出。

“ping /n 0 127.1>nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。  

7、随机数(%random%)的应用技巧

%RANDOM% 系统变量返回0 到32767之间的任意十进制数字。0~32767实际就是15位二进制数的范围。那么,如何获取100以内的随机数呢?很简单,将%RANDOM%按 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

请按任意键继续. . .

生成5 个 100以内的随机数,求余数运算set /a randomnum=!Random!%%100中的100可以是 1~32768之间的任意整数。

@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  

生成给定位数的随机密码,26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。

@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  

生成给定位数的随机密码,26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。 

8、注意点

先写一个redis的开启bat文件     redis-Start.bat

再写一个redis的登陆bat文件   redis-login.bat

最后写一个redis汇总启动文件    Redis.bat

@echo off 
start /D "F:批处理文件汇总" call redis-Start.bat
start /D "F:批处理文件汇总" call redis-login.bat

参数D 后面的参数表示被调用命令的所在目录。

免责声明:文章转载自《批处理脚本》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于H5的混合开发介绍(一)WebView软考--操作系统知识--PV操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JAVA基础4---序列化和反序列化深入整理(JDK序列化)

一、什么是序列化和反序列化? 序列化:将对象状态信息转化成可以存储或传输的形式的过程(Java中就是将对象转化成字节序列的过程) 反序列化:从存储文件中恢复对象的过程(Java中就是通过字节序列转化成对象的过程) 二、为什么要序列化和反序列化? Java中对象都是存储在内存中,准确地说是JVM的堆或栈内存中,可以各个线程之间进行对象传输,但是无法在进程之间...

python爬取网易翻译 和MD5加密

一、程序需要知识 1、python中随机数的生成 #生成 0 ~ 9 之间的随机数 #导入 random(随机数) 模块 importrandom print(random.randint(0,9)) 2、python获取当前时间和时间戳 importtime,datetime #时间戳 print(time.time()) #今天的日期 prin...

aspp.netMVC自定义视图引擎

采用xslt作为ASP.NETmvc的视图引擎有几个好处 1彻底的实现视图和逻辑的分离(采用ASPX你无法控制别人在ASPX里面是否写逻辑代码) 2彻底的实现强类型的MODEL(自己定义视图引擎只是先一种数据方式) 3借助MODEL序列化为XML,进行XSLT转换,实现页面个性定制 4xslt的基本语法可以完成一部分JS的工作,而这正是页面基本控件布局和展...

java解决大文件断点续传

第一点:Java代码实现文件上传 FormFile file = manform.getFile(); String newfileName =null; String newpathname =null; String fileAddre ="/numUp"; try { InputStream stream = file.getInputStream(...

Hibernate 入门

Hibernate  入门 1. 什么是hibernate ORM框架/持久层框架 jdbc的一个框架 object reference mapping 通过管理对象来改变数据库中的数据 通过管理对象来操作数据库 mybatis 优势:跨数据库的无缝移植 2. 如何在项目中添加hibernate支持(手动添加) 在pom.xml添加hibernate相关...

Perl中的默认变量$_ 和 @_

默认变量$_ $_表示Perl中的“老地方”,即在没有特殊指定变量的情况下,编译器会默认使用$_变量的内容参与程序运算。 $_还经常使用作为默认匹配空间,在做正则化匹配的时候默认操作的是这个变量。 eg: 1 $_ = "hello world!"; 2 print; print没有指定输出的变量,但是编译器会默认使用$_; 1 foreach(1..10...