admin 管理员组

文章数量: 887021


2024年2月21日发(作者:网页设计大赛作品展示)

批处理常用命令及用法大全

说明:本文来自网络,由youxi01整理,由liqiochi修改完善。

阅读本文需要一定的dos基础概念,象:盘符、文件、目录(文件夹)、子目录、根目录、当前目录每个命令的完整说明请加 /? 参数参考微软的帮助文档可以看到,在 /? 帮助里,"命令扩展名"一词会经常出现"命令扩展名"是指相对于win98的dos版本而言,每个命令新增的功能

命令测试环境win2000proSP4win98的命令功能太少,就不作研究了

注:如果对某一命令还不是很熟悉,可以在命令行窗口下输入:命令名/?的方式来获得帮助。

例如:对dir命令的应用不熟悉,可以在命令行窗口下输入:dir /?

参数只列举常用参数。

注:errorlevel,msd,undelete在win7下不存在。

目录

和 @回显控制命令 ................................................................................. 3

wn 关机 .................................................................................................. 3

显示目录中的文件和子目录列表 ............................................................... 4

更改当前目录 ................................................................................................ 4

创建目录 ...................................................................................................... 5

删除目录 ........................................................................................................ 5

删除文件 ...................................................................................................... 5

文件和文件夹重命名 .................................................................................. 6

清屏 ............................................................................................................... 6

显示文件内容 .......................................................................................... 6

拷贝文件(只能复制文件) .................................................................. 6

设置cmd窗口的标题 .............................................................................. 7

显示系统版本 ............................................................................................ 7

和 vol设置卷标 ..................................................................................... 7

暂停命令 ................................................................................................ 7

和 ::注释命令 .......................................................................................... 7

和 time日期和时间 ............................................................................... 8

和 :跳转命令 .......................................................................................... 8

(外部命令)查找命令 ................................................................................. 8

(外部命令)逐屏显示 .............................................................................. 9

显示目录结构 ........................................................................................... 9

22.&顺序执行多条命令,而不管命令是否执行成功 ........................................ 9

23.&&顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令 . 9

24.||顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令 ... 9

25.|管道命令,前一个命令的执行结果输出到后一个命令 ........................... 10

附:批处理for中的管道转义|,尖号 ..................................................... 10

26.>和>>输出重定向命令 .................................................................................. 10

27.<从文件中获得输入信息,而不是从屏幕上 .............................................. 11

28.%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %* 命令行传递给批处理的参数 .... 11

设置变量 ................................................................................................... 12

................................................................................................................. 14

................................................................................................................... 15

(外部命令)选择命令 ........................................................................... 15

和ftype文件关联 ................................................................................ 16

................................................................................................................ 16

把文件或文件夹从A处移动到B处 ................................................. 17

(外部命令)文件拷贝 ............................................................................ 17

37.一些不常用的内部命令 ................................................................................ 18

(外部命令)格式化硬盘 ...................................................................... 18

(外部命令) .............................................................................................. 19

(外部命令)服务控制命令 ......................................................................... 19

和 popd 切换当前目录 .................................................................... 19

r 字符串查找增强 ................................................................................ 19

行首、行尾符规则,即 ^ 和 $ ............................................................... 21

字符集规则,即[class] ............................................................................... 21

减法规则,即[^class] ................................................................................. 21

单词前缀后缀定位规则,即 .............................................. 22

在特定日期和时间运行命令和程序。 ................................................... 22

...................................................................................................................... 23

1.判断两个字符串是否相等,if"字符串1"=="字符串2" command 语句...................................................................................................................... 23

2.判断两个数值是否相等,if 数值1 equ 数值2 command 语句 ........ 24

3.判断判断驱动器,文件或文件夹是否存在,if exist filename command

语句.............................................................................................................. 25

4.判断变量是否已经定义,if defined 变量 command 语句 ................. 26

5.判断上个命令的反回值,if errorlevel 数值 command 语句 ............. 27

补充1:if not 语句 .................................................................................... 28

补充2:IF语句嵌套的写法 ....................................................................... 29

.................................................................................................................... 29

for /f 的基本用法 ....................................................................................... 30

delims= ......................................................................................................... 31

定点提取:tokens= ..................................................................................... 31

跳过无关内容,直奔主题:skip=n ........................................................... 32

忽略以指定字符打头的行:eol=............................................................... 32

如何决定该使用 for /f 的哪种句式?(兼谈usebackq的使用) .............. 32

计数循环:for /l.......................................................................................... 33

al enabledelayedexpansion ................................................................... 33

set 变量嵌套变量 ................................................................................... 35

附:转义字符% ........................................................................................... 35

48.位运算符 ........................................................................................................ 36

................................................................................................................... 40

2.键值的数据类型。................................................................................. 45

补充概念:

1. dir中的属性

2. 通配符*,?

3. con,prn,nul

4. set中的叹号

5. 控制命令^ 和 >

6. findstr通配符

7. find多重过滤

和 @回显控制命令

@ #关闭单行回显

echo off #从下一行开始关闭回显

@echo off #从本行开始关闭回显。一般批处理第一行都是这个

echo on #从下一行开始打开回显

echo #显示当前是 echo off 状态还是echo on 状态

echo. #输出一个"回车换行",一般就是指空白行

echo hello world #输出hello world

"关闭回显"是指运行批处理文件时,不显示文件里的每条命令,只显示运行结果批处理开始和结束时,系统都会自动打开回显

wn 关机

/i 显示图形用户界面(GUI)。这必须是第一个选项。

/l 注销。这不能与 /m 或 /d 选项一起使用。

/s 关闭计算机。

/r 关闭并重新启动计算机。

/g 关闭并重新启动计算机。系统重新启动后,重新启动所有注册的应用程序。

/a 中止系统关闭。这只能在超时期间使用。

/p 关闭本地计算机,没有超时或警告。可以与 /d 和 /f 选项一起使用。

/h 休眠本地计算机。可以与 /f 选项一起使用。

/t xxx 设置关闭前的超时为 xxx 秒。有效范围是 0-315360000 (10 年),默认值为 30。如果超时时间大于 0,则默示 /f参数。

/f 强制正在运行的应用程序关闭,不前台警告用户。当为 /t 参数指

定大于 0 的值时,则默示 /f 参数。

显示目录中的文件和子目录列表

dir #显示当前目录中的文件和子目录

dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件

/A 显示具有指定属性的文件。e.g. dir /a:h或dir /ah(冒号可省略)

属性 D 目录 R 只读文件

H 隐藏文件 A 准备存档的文件

S 系统文件 I 无内容索引文件

L 解析点 - 表示“否”的前缀

/B 使用空格式(没有标题信息或摘要)。(没有时间,文件大小和总结,只有文件名)

/O 用分类顺序列出文件。

排列顺序 N 按名称(字母顺序) S 按大小(从小到大)

E 按扩展名(字母顺序) D 按日期/时间(从先到后)

G 组目录优先 - 反转顺序的前缀

dir c: /a:d #显示 C 盘当前目录中的目录

dir c: /a:-d #显示 C 盘根目录中的文件

dir d:mp3 /b/p #逐屏显示 d:mp3 目录里的文件,/b只显示文件名,不显示时间和大小;/p在每个信息屏幕后暂停。

dir *.exe /s显示当前目录和子目录里所有的.exe文件(/s显示所有文件)。

其中 * 是通配符,代表所有的文件名;通配符 ? 代表一个任意字母或汉字,如

c*.* 代表以 c 开头的所有文件;?.exe 代表所有文件名是一个字母的.exe文件。如果指定的目录或文件不存在,将返回 errorlevel 为1;

每个文件夹的 dir 输出都会有2个子目录

dir . #显示当前目录中的文件和子目录

dir .. #显示当前目录的上级目录中的文件和子目录

其它参数可参考 dir /?

更改当前目录

cd mp3 #进入当前目录中的mp3 目录

cd .. #进入当前目录中的上级目录(进入根目录后不能继续)

cd #进入根目录

cd #显示当前目录

cd /d d:mp3 #可以同时更改盘符和目录(/d可更改驱动器)

cd.>c:(完美) 可用于新建空白txt文件。

cd "Documents and Settings"All users 文件名带空格,路径前需要加上引号!!如

果更改到的目录不存在,则出错返回 errorlevel=1。CHDIR 命令不把空格当作分隔符,因此有可能将目录名改为一个带有空格但不带有引号的子目录名。例如:

cd winntprofilesusernameprogramsstart menu

与下列相同:

cd "winntprofilesusernameprogramsstart menu"

创建目录

md abc #在当前目录里建立子目录 abc

md d:abc #如果 d:a 不存在,将会自动创建

文件名带空格,路径前需要加上引号。

删除目录

rd abc #删除当前目录里的 abc 子目录,要求为空目录,即abc目录下不能有文件夹和文件。

rd /s/q d:temp #删除 d:temp 文件夹及其子文件夹和文件,不需要按 Y

确认

/S 除目录本身外,还将删除指定目录下的所有子目录和文件。用于删除目录树。

/Q 安静模式,带 /S 删除目录树时不要求确认

删除文件

del d: #删除指定文件,不能是隐藏、系统、只读文件

del *.*删除当前目录里的所有文件,不包括隐藏、系统、只读文件,要求按 Y 确认

del /q/a/f d:temp*.*删除 d:temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录及子目录下的文件

del /q/a/f/s d:temp*.*删除 d:temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录

/P 删除每一个文件之前提示确认。

/F 强制删除只读文件。

/S 删除所有子目录中的文件。

/Q 安静模式。删除全局通配符时,不要求确认

/A 根据属性选择要删除的文件。只有/a则表示包括所有属性。

属性 R 只读文件 S 系统文件

H 隐藏文件 A 存档文件

I 无内容索引文件 L 重分析点

- 表示“否”的前缀

文件和文件夹重命名

ren #把 更名为

ren *.txt *.ini #把当前目录里所有.txt文件改成.ini文件

ren d:temp tmp #支持对文件夹的重命名

不能为目标文件指定新的驱动器或路径。

清屏

显示文件内容

type c: #显示指定文件的内容,程序文件一般会显示乱码

type *.txt #显示当前目录里所有.txt文件的内容

type nul > c:(完美) 新建一个空白的txt文件。

拷贝文件(只能复制文件)

copy c: d: 复制 c: 文件到 d:

copy c: d: 复制 c: 文件到 d: ,并重命名为

copy c:*.* 复制 c: 所有文件到当前目录,不包括隐藏文件和系统文件。不指定目标路径,则默认目标路径为当前目录

copy con 从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为文件。con代表屏幕,prn代表打印机,nul代表空设备

copy + 合并 和 的内容,保存为 。文件如果不指定 ,则保存到

copy + 复制文件到自己,实际上是修改了文件日期

/Y 不使用确认是否要覆盖现有目标文件的提示。(默认选项)

/-Y 使用确认是否要覆盖现有目标文件的提示。

如果文件地址有空格,要加双引号"。

设置cmd窗口的标题

title 新标题 #可以看到cmd窗口的标题栏变了(没加")

显示系统版本

和 vol设置卷标

vol #显示卷标

label #显示卷标,同时提示输入新卷标

label c:system #设置C盘的卷标为 system

暂停命令

运行该命令时,将显示下面的消息:请按任意键继续 . . .

一般用于看清楚屏幕上显示的内容

和 ::注释命令

注释行不执行操作

rem.>c:(完美) 可用于新建txt文件。

;xxx 相当于rem命令(;后面的忽略)。

和 time日期和时间

date #显示当前日期,并提示输入新日期,按"回车"略过输入。这个日期格式需要与系统的一样,才可以被接受。

date/t #只显示当前日期,不提示输入新日期

time #显示当前时间,并提示输入新时间,按"回车"略过输入

time/t #只显示当前时间,不提示输入新时间

和 :跳转命令

:label #行首为:表示该行是标签行,必须单独一行,标签行不执行操作

goto label #跳转到指定的标签那一行

(外部命令)查找命令

find "abc" c: 在 c: 文件里查找含 abc 字符串的行。如果找不到,将设 errorlevel 返回码为1。引号是不可少的。

find /i "abc" c: 查找含 abc 的行,忽略大小写

find /c "abc" c: 显示含 abc 的行的行数

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

/N 显示行号。

find "abc" |find "xyz" 它表示在中查找同时存在字符串abc和字符串xyz的行,称为多重过滤。

要查找的内容就是双引号本身:把双引号本身先用双引号转义,再放到双引号对中,写成 find """" 的格式,如果要查找两个连续的双引号,则应该写成

find """""" 。

find仅仅针对位于同一行上的字符串,不能查找跨行的字符块。

find与findstr的不同:

1、统计含指定字符串的总行数。find /c "abc" 可以统计中含有字符串abc的总行数,而findstr则没有直接提供该功能,需要配合for语句才能实现;

2、find可以读取Unicode格式的文本,而findstr则不行;

3、find可以过滤某些特殊字符,而findstr则不行

(外部命令)逐屏显示

more c: #逐屏显示 c: 的文件内容

/C 显示页面前先清除屏幕

/S 将多个空白行缩成一个空白行(这一行还是存在)

显示目录结构

tree d: #显示D盘的文件目录结构

22.&顺序执行多条命令,而不管命令是否执行成功

c: & cd & dir /w 相当于把下面3行命令写到1行去了c:cddir /w

23.&&顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令

f: && cd && dir >c: 注意如果f盘不存在,那么后面2条命令将不会执行

find "ok" c: && echo 成功 如果找到了"ok"字样,就显示"成功",找不到就不显示

24.||顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令

find "ok" c: || echo 不成功 如果找不到"ok"字样,就显示"不成功",找到了就不显示

25.|管道命令,前一个命令的执行结果输出到后一个命令

dir *.* /s/a | find /c ".exe" 管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令。

该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数

type c:|more这个和 more c: 的效果是一样的

附:批处理for中的管道转义|,尖号

|的作用是连接两条命令,把第一条命令的结果作为第二条命令的参数。

for /f "tokens=2 delims=:" %%i in ('ipconfig /all|findstr /c:"IP Address"') do

@echo %%i

for的集合中没有用^对|转义,而出错,为何出错呢?

这是因为被系统误认为|之前的第一条命令是

for /f "tokens=2 delims=:" %%i in ('ipconfig /all

而不是集合中的ipconfig/all ,第二条命令是

findstr /c:"IP Address"') do @echo %%i

而不是findstr /c:"IP Address"'

for /f "tokens=2 delims=:" %%i in ('ipconfig /all 不是完整的命令,当然出错。所以必须加^对|转义,它连接的只是ipconfig/all和findstr /c:"IP Address"

其他的& && || > >>同样道理。

26.>和>>输出重定向命令

> 清除文件中原有的内容后再写入

>> 追加内容到文件末尾,而不会清除原有的内容,主要用于将本来显示在屏幕上的内容输出到指定文件中。指定文件如果不存在,则自动生成该文件

echo hello world>c: 生成c:文件,内容为hello world

这个格式在批处理文件里用得很多,可以生成 .reg .bat .vbs 等临时文件

type c: >prn屏幕上不显示文件内容,转向输出到打印机

echo hello world>con在屏幕上显示hello world,实际上所有输出都是默认 >con

copy c: f: >nul拷贝文件,并且不显示"文件复制成功"的提示信息,但如果f盘不存在,还是会显示出错信息

copy c: f: >nul 2>nul不显示"文件复制成功"的提示信息,并且f盘不存在的话,也不显示错误提示信息

echo ^^W ^> ^W>c: 生成的文件内容为 ^W > W。^ 和 > 是控制命令,

要把它们输出到文件,必须在前面加个 ^ 符号

27.<从文件中获得输入信息,而不是从屏幕上

一般用于 date time label 等需要等待输入的命令

@echo off

echo 2005-05-01>

date <

del

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

28.%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %* 命令行传递给批处理的参数

%0 批处理文件本身

%1 第一个参数

%9 第九个参数

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

在C盘根目录新建,内容如下:

@echo off

echo %0

echo %1

echo %2

echo %*

运行cmd,输入 c: "/a" /b /c /d,可以看出每个参数的含意,显示如下:

%0:批处理文件本身

"/a" %1:第一个参数

/b %2:第二个参数

"/a" /b /c /d %*:所有参数

解释:运行,显示%0,%0是命令行传递给批处理的参数,即。

在g:a建立,修改内容如下:

@echo off 结果:

echo %1 "/a"

echo %~1 /a

echo %0

echo %~f0 g:

echo %~d0 g:

echo %~p0 a

echo %~n0 test

echo %~x0 .bat

echo %~s0 g:

echo %~a0 --a------

echo %~t0 2012/01/16 15:26

echo %~z0 136

再运行cmd,输入 g: "/a" /b /c /d,结果见上。

可以参照 call/? 或 for/? 看出每个参数的含意:

%~I - 删除任何引号("),扩展 %I

%~fI - 将 %I 扩展到一个完全合格的路径名

%~dI - 仅将 %I 扩展到一个驱动器号

%~pI - 仅将 %I 扩展到一个路径

%~nI - 仅将 %I 扩展到一个文件名

%~xI - 仅将 %I 扩展到一个文件扩展名

%~sI - 扩展的路径只含有短名

%~aI - 将 %I 扩展到文件的文件属性

%~tI - 将 %I 扩展到文件的日期/时间

%~zI - 将 %I 扩展到文件的大小

可以组合修饰符来得到多重结果:

%~dpI - 仅将 %I 扩展到一个驱动器号和路径

%~nxI - 仅将 %I 扩展到一个文件名和扩展名

%~fsI - 仅将 %I 扩展到一个带有短名的完整路径名

注意这里可以对文件进行日期比较和大小比较

echo load "%%1" "%%2">c: 生成的文件内容为 load "%1" "%2"。批处理文件里,用这个格式把命令行参数输出到文件

设置变量

引用变量可在变量名前后加 % ,即 %变量名%

set #显示目前所有可用的变量,包括系统变量和自定义的变量

echo %SystemDrive% #显示系统盘盘符。系统变量可以直接引用

set p #显示所有以p开头的变量,要是一个也没有就设errorlevel=1

set p=aa1bb1aa2bb2 #设置变量p,并赋值为 = 后面的字符串,即aa1bb1aa2bb2

echo %p% #显示变量p代表的字符串,即aa1bb1aa2bb2

echo %p:~6% #显示变量p中第6个字符以后的所有字符,即aa2bb2

echo %p:~6,3% #显示第6个字符以后的3个字符,即aa2

echo %p:~0,3%或echo %p:~,3% #显示前3个字符,即aa1

echo %p:~-2% #显示最后面的2个字符,即b2

echo %p:~0,-2% #显示除了最后2个字符以外的其它字符,即aa1bb1aa2b

echo %p:aa=c% #用c替换变量p中所有的aa,即显示c1bb1c2bb2

echo %p:aa=% #将变量p中的所有aa字符串置换为空,即显示1bb12bb2

echo %p:*bb=c% #第一个bb及其之前的所有字符被替换为c,即显示c1aa2bb2

set p=%p:*bb=c% #设置变量p,赋值为 %p:*bb=c% ,即c1aa2bb2

set /a p=39 #设置p为数值型变量,值为39(/A 命令行开关指定等号右边的字符串为被评估的数字表达式。)set /a 里直接通过变量名由 set 解释变量时,空变量名或变量值不为合法数字的变量都被理解为0。set /a的特性就是在引用变量时,可以省略 “%”(当然你也可以不省略——但强烈建议你省略)。

set /a p=39/10 #支持运算符,有小数时用去尾法,39/10=3.9,去尾得3,p=3

set /a p=p/10 #用 /a 参数时,在 = 后面的变量可以不加%直接引用

set /a p="1&0" #"与"运算,要加引号。其它支持的运算符参见set/?

set p= #取消p变量。

set /p=

set /p p=请输入 屏幕上显示"请输入",并会将输入的字符串赋值给变量p。注意这条可以用来取代 choice 命令。

一旦使用此参数后,变量p为输入值,而不加上等号后面的。即:在以下命令中输入12:

set /p p=请输入 or set /p p=请输入: or set /p p=”请输入”

最后显示的都是12。

复合算术运算符

复合运算符一共有10个,其中复合算术运算符有5个,它们分别是“+=,-=,*=,/=,%=”。

n+=%%i就是 n=n+%%i。即:”变量1 复合运算符 变量2” 就等于“变量1=变量1

对应的算术运算符 变量2”。

例如:n*=3 就是 n=n*3。

注意变量在 if 和 for 的复合语句里是一次性全部替换的,如

@echo off

set p=aaa

if %p%==aaa (

echo %p%

set p=bbb

echo %p% )

结果将显示aaaaaa,因为在读取 if 语句时已经将所有 %p% 替换为aaa。这里的"替换",在 /? 帮助里就是指"扩充"、"环境变量扩充"可以启用"延缓环境变量扩充",用 ! 来引用变量,即 !变量名!。在"延迟环境变量扩展"启用后,CMD会用!号来判断这是不是一个变量。如没启用前变量用%name%这样的格式判断,启

用后就用!name!这样的格式判断了

@echo off

SETLOCAL ENABLEDELAYEDEXPANSION

set p=aaa

if %p%==aaa (

echo %p%

set p=bbb

echo !p! )

ENDLOCAL

结果将显示aaabbb

还有几个动态变量,运行 set 看不到

%CD% #代表当前目录的字符串

%DATE% #当前日期

%TIME% #当前时间

%RANDOM% #随机整数,介于0~32767

%ERRORLEVEL% #当前ERRORLEVEL 值

%CMDEXTVERSION% #当前命令处理器扩展名版本号

%CMDCMDLINE% #调用命令处理器的原始命令行,可以用echo命令查看每个变量值,如 echo %time%。注意 %time% 精确到毫秒,在批处理需要延时处理时可以用到

批处理中调用外部程序的命令,否则等外部程序完成后才继续执行剩下的指令

/"title" 在窗口标题栏中显示的标题。

/MIN 以最小化方式启动窗口。

/MAX 以最大化方式启动窗口。

/LOW 在 IDLE 优先级类中启动应用程序。

/NORMAL 在 NORMAL 优先级类中启动应用程序。

/HIGH 在 HIGH 优先级类中启动应用程序。

/REALTIME 在 REALTIME 优先级类中启动应用程序。

/WAIT 启动应用程序并等待它终止。

将文件名作为命令键入,非可执行文件可以通过文件关联调用。(例如,

会调用跟 .DOC 文件扩展名关联的应用程序)。

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

@echo off

cd /d %~dp0 ::将命令本身扩展到一个驱动器号和路径

regedit /s 劲舞团.reg

start

不加 start 命令的话,"劲舞团"运行时,后面会有个黑乎乎的cmd窗口

批处理中调用另外一个批处理的命令,否则剩下的批处理指令将不会被执行。

有时有的应用程序用start调用出错的,也可以call调用

(外部命令)选择命令

让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234……

win98里是

win2000pro里没有,可以从win98里拷过来

win2003里是

choice /N /C y /T 5 /D y>nul 延时5秒

/C choices 指定要创建的选项列表。默认列表是 "YN"。

/N 在提示符中隐藏选项列表。提示前面的消息得到显示,选项依旧处于启用状态。

/CS 允许选择分大小写的选项。在默认情况下,这个工具是不分大小写的。

/T timeout 做出默认选择之前,暂停的秒数。可接受的值是从 0到 9999。如果指定了 0,就不会有暂停,默认选项会得到选择。

/D choice 在 nnnn 秒之后指定默认选项。字符必须在用 /C 选项指定的一组选择中; 同时,必须用 /T 指定 nnnn。

/M text 指定提示之前要显示的消息。如果没有指定,工具只显示提示。

示例:

CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"

CHOICE /T 10 /C ync /CS /D y

CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"

CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"

下面是个 choice 语句的例子

@echo off

rem 以下在win2000pro运行通过,从win98里拷的文件

choice /c:abc aaa,bbb,ccc

if errorlevel 3 goto ccc

if %errorlevel%==2 goto bbb

if errorlevel==1 goto aaa

rem 必须先判断数值高的返回码rem 可以看到 errorlevel 值的判断有3种写法,有时某种写法不好用,可以用另外的写法

rem 直接运行chioce相当于运行

choice /c:yn:aaa

echo aaa

goto end

:bbb

echo bbb

goto end

:ccc

echo ccc

goto end

:end

和ftype文件关联

assoc 设置'文件扩展名'关联,关联到'文件类型';ftype 设置'文件类型'关联,关联到'执行程序和参数'。

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

txtfile=%SystemRoot% %1。可以在"文件夹选项"→"文件类型"里修改这2种关联

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

assoc .txt #显示.txt代表的'文件类型',结果显示 .txt=txtfile

assoc .doc #显示.doc代表的'文件类型',结果显示 .doc=nt.8

assoc .exe #显示.exe代表的'文件类型',结果显示 .exe=exefile

如果不为文件类型指定任何参数,命令会删除文件扩展名的关联。

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

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

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

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

ftype exefile="%1" %* 恢复 exefile 的正确关联。如果该关联已经被破坏,可以运行 ,再输入这条命令

attrib [ +r|-r] [ +s|-s] [ +h|-h] [ +c|-c] [ [ drive:] [ path] filename]

+r 设置只读属性。

-r 清除只读属性。

+s 设置系统属性。

-s 清除系统属性。

+h 设置隐藏属性。

-h 清除隐藏属性。

+c 设置压缩属性。

-c 清除压缩属性。

前面是加号和减号,不是/

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

/D 也处理文件夹。

例:g:a>attrib +r

把文件或文件夹从A处移动到B处

基本格式为 move A B,B只能是目录路径。move不能跨分区移动文件夹,不能够识别出带隐藏或系统属性的文件,要移动此等文件,只能先用attrib命令去掉这些文件的隐藏或系统属性,再move。

1)、如果A、B同为文件夹名,则把A移动到B目录下;

2)、如果A为文件名,

① B为文件夹名的时候,将把A移动到B目录下;

② B为文件名的时候,将把A重命名为B;如果B所在的位置为另一目录,则表示在把A移动到B所在的目录下的同时,重命名为B。

move c: d:

如果有重名文件出现,move不会成功,它会询问你:改写××吗?(Yes/No/All):其中,××表示目的地的重名文件。如果选择Yes,将覆盖重名文件;如果选择No,则放弃move操作;如果选择All,则在批量move的时候,如果存在同名文件,将不再询问是否覆盖,而是直接覆盖掉重名文件。默认情况下,move 是带

/-y 开关的。

(外部命令)文件拷贝

xcopy d:mp3 e:mp3 /s/e/i/y 复制 d:mp3 文件夹、所有子文件夹和文件到

e: ,覆盖已有文件。加 /i 表示如果 e: 没有 mp3 文件夹就自动新建一个,否则会有询问。

即使使用/s、/e、/t参数,也无法复制最上层的那层目录,例:

G:backuptaidian下有FMRecord和MicRecord两个目录和一些文件,

xcopy /i /s /e /y /k G:backuptaidian g:

此时,g:下产生FMRecord和MicRecord两个目录和那些文件,而不产生taidian这个文件夹。

/D:m-d-y 复制在指定日期或指定日期以后更改的文件。如果没有提供日期,只复制那些源时间比目标时间新的文件。

/P 创建每个目标文件之前提示您。

/S 复制目录和子目录以及目录和子目录下的文件,不包括空目录。

/E 复制目录和子目录以及目录和子目录下的文件,包括空目录。与

/S /E 相同。可以用来修改 /T。

/C 即使有错误,也继续复制。

/I 如果目标不存在,且要复制多个文件,则假定目标必须是目录。

/Q 复制时不显示文件名。

/F 复制时显示完整的源文件名和目标文件名。

/L 显示要复制的文件。

/H 也复制隐藏文件和系统文件。

/R 覆盖只读文件。

/T 创建目录结构,包括子目录,但不复制文件。不包括空目录。/T

/E 包括空目录。

/U 只复制已经存在于目标中的文件。

/K 复制属性。一般的 Xcopy 会重设只读属性。

/Y 取消提示以确认要覆盖现有目标文件。

/-Y 要提示以确认要覆盖现有目标文件。

37.一些不常用的内部命令

>& 将一个句柄的输出写入到另一个句柄的输入中

<& 从一个句柄读取输入并将其写入到另一个句柄输出中

shift 命令行传递给批处理的参数不止9个时,用以切换参数

color 设置cmd窗口的显示颜色

pormpt 更改命令提示符号,默认都是 盘符:路径> ,如 c:>

subst (外部命令)映射磁盘。

subst z: serverd #这样输入z:就可以访问serverd了

subst z: /d #取消该映射

subst #显示目前所有的映射

(外部命令)格式化硬盘

format c: /q/u/autotest

/q 表示快速格式化;/autotest表示自动格式化,不需要按 Y 确认;

/U 无条件格式化磁盘,格式化时将不保留磁盘原先的任何信息。对磁盘有一定磨损。(“/q”则不会对磁盘有磨损且数据可以恢复。)

format c: /c 仅适于 NTFS: 默认情况下,将压缩在该新建卷上创建的文件。

/FS:filesystem 指定文件系统类型(FAT、FAT32 或 NTFS)。

(外部命令)

ping -l 65500 -t 192.168.1.200 不停的向192.168.1.200计算机发送大小为65500byte的数据包

ping -n 10 127.0.0.1>nul ping自己10次,可用于批处理延时10秒

(外部命令)服务控制命令

sc create aaa displayname= bbb start= auto binpath=

"C:"创建服务,服务名称aaa,显示名称bbb,启动类型:自动,可执行文件的路径"C:"

sc description aaa "ccc"更改aaa的描述为ccc

sc config aaa start= disabled binpath= "C: -k

netsvcs"更改aaa的启动类型:已禁用;更改aaa的可执行文件的路径"C: -k netsvcs"

sc config aaa start= demand displayname= ddd 更改aaa的启动类型:手动;更改aaa的显示名称ddd

sc start aaa启动aaa服务

sc stop aaa停止aaa服务

sc delete aaa删除aaa服务

和 popd 切换当前目录

@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

一般用处不大,在当前目录名不确定时,会有点帮助

r 字符串查找增强

/B 在一行的开始配对模式。

/E 在一行的结尾配对模式。

/L 按字使用搜索字符串。

/N 显示行号。

例:有一文件,内容为

…………

fullScreen=no

…………

运行显示:

14:fullScreen=no

/R 将搜索字符串作为一般表达式使用。

findstr /r "icq msn"

在中查找包含有 “icq”或“msn”的行,查找的多个字符串间用空格隔格开。

/S 在当前目录和所有子目录中搜索匹配文件。

findstr /s /i "MSN" *.txt

在当前目录和所有子目录中的txt文件中搜索字符串"MSN"(不区分字母大小写)。

/I 指定搜索不分大小写。

findstr /i "MSN"

在中查找包含有“MSN”这三个字符的行,且不区分大小写。

/M 如果文件含有匹配项,只打印其文件名。

/P 忽略有不可打印字符的文件。

/C:string 使用指定字符串作为文字搜索字符串。

除非参数有 /C 前缀,请使用空格隔开搜索字符串。

例如: FINDSTR "hello there" x.y 在文件 x.y 中寻找"hello"或"there"

FINDSTR /C:"hello there" x.y 在文件 x.y 寻找 "hello there"。

/G:file 从指定的文件获得搜索字符串。 (/ 代表控制台)。

/D:dir 查找以分号为分隔符的目录列表

. 通配符: 任何字符,只能是一个,包括字母、数字、半角符号还有空格。

* 重复符: 代表前面字母的出现次数(出现次数从0到多次,0表示没有)。

findstr ak5*

在文件中查找出现一个“ak”字符串,以及ak后面出现过0次或者任意次5的字符行。如:

ak

ak5

akbbb

ak125

ak555

等都匹配。

行首、行尾符规则,即 ^ 和 $

findstr "^step"

在文件中查找行首为step字符串的行。

如:

stepkdka

step 456

这两行都匹配的。

findstr "step$"

在文件中查找行尾为step字符串的行。

如:

123 dstep

123step

这两行也匹配的。

字符集规则,即[class]

①表示含有集里的任意一个字符的即匹配。

②该字符集里的元素可以是字母和数字和一般的半角字符,如:}{ ,.][等,但双引号"不被识别。不能是汉字,汉字不被正确解释(汉字不是ASCII码)。如果在字符集内插入通配符和重复符号,即"[.*]"将会把. 和 *视为普通字符,没有通配和重复的含义。

findstr "[a-fl-z]"

在文件中查找小写字符a到f 或l到z的任意一字母的行,但不包含g h I

j k这几个字母。

findstr "M[abc][123]Y"

在文件中查找可以匹配 Ma1Y , Mb1Y, Mc1Y; Ma2Y , Mb2Y, Mc2Y; Ma3Y ,

Mb3Y, Mc3Y的行。

减法规则,即[^class]

findstr "[^a-z]"

如果是纯字母的行便过滤掉,例如 sdlfjlkjlksjdklfjlskdf 这样的字符将被过滤,如果是sdfksjdkf99999这样的形式则过滤不了。

注意,纯字母的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!

findstr "[^add]"

过滤仅含有由a d d三个字母组成的纯字母字符串的行。

如:

a

ad

ddaadd

dd

这些行都会被过滤。

单词前缀后缀定位规则,即

该xyz可以是英文单词或数字,但不适用于汉字。符号 理解为转义符,化解小于号和大于号的重定向命令含义。

该规则是匹配类似单个英文单词的。

findstr "

所有含有以echo为前缀的字符串的行,都匹配。

如:

echo:kkk a add

jjkk echo

这两行都匹配。

findstr "echo>"

所有含有以echo为后缀的字符串的行,都匹配。

如:

qq bbecho 这一行也匹配。

findstr ""

这里是用来精确查找单词。查找单词end的行,cdkend,end echo,bcd-end-jjkk匹配。注意:ended这类词不匹配。

注意:加了参数或者未加参数但是使用了上面4中规则的字符串需要加双引号。如:

findstr /r "icq msn"

findstr ""

在特定日期和时间运行命令和程序。

要使用 AT 命令,计划服务必须已在运行中。

AT [ [id] [/DELETE] | /DELETE [/YES]]

AT time [ /EVERY:date[,...] | /NEXT:date[,...]] "command"

id 指定给已计划命令的识别号。

/delete 删除某个已计划的命令。如果省略 id,计算机上所有已计划的命令都会被删除。

/yes 不需要进一步确认时,跟删除所有作业的命令一起使用。

time 指定运行命令的时间。

/every:date[,...] 指定在每周或每月的特定日期运行命令。如果省略日期,则默认为在每月的本日运行。

/next:date[,...] 指定在下一个指定日期(如,下周四)运行命令。如果省略日期,则默认为在每月的本日运行。

"command" 准备运行的 Windows NT 命令或批处理程序。

5种if语句的基本语法:

1。判断两个字符串是否相等,if "字符串1"=="字符串2" command 语句;

2。判断两个数值是否相等,if 数值1 equ 数值2 command 语句;

3。判断判断驱动器,文件或文件夹是否存在,if exist filename command 语句;

4。判断变量是否已经定义,if defined 变量 command 语句;

5。判断上个命令的返回值,if errorlevel 数值 command 语句。

------------------------------------------------------------------------------------------------------

1.判断两个字符串是否相等,if"字符串1"=="字符串2"

command 语句

注意:在"字符串1"=="字符串2"中,是两个连续的"="

例1

@echo off

set /p var1=请输入第一个比较的字符:

set /p var2=请输入第二个比软的字符:

if "%var1%"=="%var2%" (echo 输入的两个字符相同) else echo 输入的两个字符不相同

pause

执行后会要求你输入两个字符串,然后批处理判断它俩是否相同。经测试,%var1%无需加引号。

在判断字符串是否相等的时候,if是会区分大小写的,请看:

例2

@echo off

if "a"=="A" (echo 输入的两个字符相同) else echo 输入的两个字符不相同

pause

执行后会显示:输入的两个字符不相同

如果我们不想让它区分大小写,则可以加上/i 参数。再看下面这个例子:

例3

@echo off

if /i "a"=="A" (echo 输入的两个字符相同) else echo 输入的两个字符不相同

pause

这次执行后会显示:输入的两个字符相同

2.判断两个数值是否相等,if 数值1 equ 数值2 command 语句

语句中的equ 表示相等的意思,判断两个数值之间的大小关系还有以下关系符号:

中文含义 关系符 英文解释

等于 equ equal

大于 gtr greater than

大于或等于 geq greater than or equal

小于 lss less than

小于或等于 leq less than or equal

不等于 neq no equal

我们还是来看个例子:

例4

@echo off

set /p var=请输入一个数字:

if %var% geq 10 (echo 此数大于或等于10) else echo 此数小于10

pause

注意哦,批处理中的大于号,小于号,等于号等等都不能用:“>” “<” “=” 这些符号,而要用像"gtr"这类的。

☆注意:if 比较字符串与比较数字 之间的区别,它们的区别体现在引号""上面,请看下面的例子

【example 1】

@echo off

if "12" lss "4" (echo 12竟然小于4哦?) else echo 12当然不会小于4的!

pause

执行的结果是:12竟然小于4哦?

【example 2】

@echo off

if 12 lss 4 (echo 12竟然小于4哦?) else echo 12当然不会小于4的!

Pause

执行的结果是:12当然不会小于4的!

为什么【example 1】中加了双引号""会出错呢?

原因如下:

如果要比较的两个元素加了双引号"",那么会被当成是字符的比较。两个元素作比较的流程是:先比较两个元素的首位,如果首位相同,再比较第二位,如果第二位相同,再比较第三位……。依此,在【example 1】if "12" lss "4" 语句中,实质是1与4的比较,1当然小于4,所以执行了后面的命令:echo 12竟然小于4哦?

☆建议:如果是字符串的比较就使用双引号"" 是数字的比较就不用双引号了!

3.判断判断驱动器,文件或文件夹是否存在,if exist filename

command 语句

我们来瞧瞧这个判断驱动器,文件或者文件夹是否存在的语句,这里if exist

filename 是表示:存在 filename的

意思。

例5

@echo off

if exist "e:" (echo e盘存在) else echo e盘不存在

pause>nul

这里是判断e: 是否存在!

例6

@echo off

if exist d: (echo 文件存在!) else echo 文件不存在!

pause

这个例子是用来判断文件是否存在的,但并不严谨!如果是一个文件夹而不是一个文件时,上面的判断就不行了!那么如何判断指定的文件是否存在?请看:

@echo off

dir /a-d d: >nul 2>nul

if %errorlevel%==0 (echo 文件存在!) else echo 文件不存在!

Pause

先用dir的/a-d参数去除的目录属性,指定说明要搜索的是文件而不是文件夹,并把结果(包括正确和错误)屏蔽(>nul 2>nul),如果dir找到了文件,那么其errorlevel值(dir命令的退出编码)会被设为0,否则为1则是没有此文件。当然也可以用||和&&来判断。关于为什么要用if %errorlevel%==0

而不用if errorlevel 0呢?在后面if errorlevel中会有说明!

例7

@echo off

if exist test (echo test 是文件夹) else echo test 是文件

pause

这里是判断文件夹是否存在。对于文件夹存在的判断,我们不可以用以下两种写法:

第①种

@echo off

if exist test. (echo test 是文件夹) else echo test 是文件

pause

第②种

@echo off

if exist testnul (echo test 是文件夹) else echo test 是文件

pause

4.判断变量是否已经定义,if defined 变量 command 语句

这是一个判断变量是否已被定义的语句,我们还是先看例子:

例8

@echo off

if defined a (echo 变量 a 已定义) else (echo 变量 a 没有被定义)

pause

执行后显示:变量 a 没有被定义

例9

@echo off

set a=

if defined a (echo 变量 a 已定义) else (echo 变量 a 没有被定义)

pause

执行后显示:变量 a 没有被定义

注意:set a=这后面是没有空格的。

例10

@echo off

set a=10

if defined a (echo 变量 a 已定义) else (echo 变量 a 没有被定义)

pause

执行后显示:变量 a 已定义

看了上面三个例子,你应该发现点什么了吧?现在我们应该知道了:当变量不存在或是值为空时,变量则为未定义。

当我们用if defined 变量 command 语句判断变量是否被定义时,请注意 变量

为不使用引导符号%的变量名,不能用写为%变量%,否则出错。

大家来试一下下面的这两个例子,

例11

@echo off

set var1=5

if defined var1 (echo 变量var1已定义) else (echo 变量var1没有被定义)

set /p var2=请输入一个数字:

if defined %var2% (echo 变量var2已定义) else (echo 变量var2没有被定义)

pause

例12

@echo off

set var1=5

if defined var1 (echo 变量var1已定义) else (echo 变量var1没有被定义)

set /p var2=请输入一个数字:

if defined var2 (echo 变量var2已定义) else (echo 变量var2没有被定义)

pause

注意例11和例12哦:一个是%var2%而另一个是var2

5.判断上个命令的反回值,if errorlevel 数值 command 语句

这个语句是用于判断上一个命令执行的返回值errorlevel,我们还是先来看看例子,

例13

@echo off

net user

if %errorlevel% == 0 (echo net user 命令执行成功) else (echo net user 命令执行失败)

Pause

注意:%errorlevel% 这是个系统变量,所以用两个%括起来,这里的==为两个连续的=。也许有些朋友说我上面的例子是不是写错了?按照语法应该写成“if

errorlevel 0”才对的呀。如果你是这样用的话,那你就错了,还真不信呀?OK,我们来设计个实验看看:

例14

@echo off

set /p input=请输入任意一条命令:

if errorlevel 0 (echo %input% 命令执行成功) else (echo %input% 命令执行失败)

pause

用这种语法,不管你前面的命令,是否执行成功,它都会认为命令成功了。何解?

if errorlevel 语句的特点:

当使用 if errorlevel 0 cmmand 句式时,它的含义是:如果返回的错误码值大于或等于0 的时候,将执行cmmand操作;

当使用 if %errorlevel%==0 cmmand 句式时,它含义是:如果返回的错误码值等于0 的时候,将执行cmmand操作。

一般上一条命令的执行结果返回的值只有两个,"成功"用0 表示 "失败"用 1 表示,实际上,errorlevel 返回值可以在0~255 之间,例如xcopy 默认的errorlevel

值就有5 个,分别表示5 种执行状态:

0复制文件成功

1 未找到复制文件

2 用户通过CTRL C 终止了xcopy操作

4 出现了初始化错误

5 出现了磁盘写入错误

对于if 条件语句,常用的也就上面那5条吧,下面我们来看一下它的两种格式:

if条件语句的完整格式是:if 条件表达式 (语句1) else (语句2)

它的含义是:如果 条件表达式 成立,就执行 语句1,否则,将执行 语句2。else后的 语句2 也可以不用括号括起。

if条件语句的简单格式是:if 条件表达式 (语句)

它的含义是:如果 条件表达式 成立,将执行 语句,否则,什么都不做。条件表达式后的 语句 也可以不用括号括起。

例15

@echo off

if exist "d:" (del "d:")

pause

你也可以写成下面这样

例16

@echo off

if exist "d:" del "d:"

pause

补充1:if not 语句

对于if 语句前面的5种基本语法,都可以加上not参数,如

1。if not "字符串1"=="字符串2" command 语句;

2。if not数值1 equ 数值2 command 语句;

3。If not exist filename command 语句;

4。if not defined 变量 command 语句;

5。if not errorlevel 数值 command 语句。

在if 条件表达式 (语句) 语句,如没有not参数,默认是判断条件成立时,执行语句;如有not参数,判断条件失败时,执行语句。

我们看一下下面的例子:

例17

@echo off

if exist "c:" (echo C盘存在) else echo C盘不存在

pause

执行后显示:C盘存在

例18

@echo off

if not exist "c:" (echo C盘存在) else echo C盘不存在

pause

执行后显示:C盘不存在

不会吧,例18中执行后显示:C盘不存在,这简值是在说瞎话了,那到底是什么回事呢?

if not exist "c:" (echo C盘存在) else echo C盘不存在

此语句中文意思:如果不存在C: 就执行显示C盘存在;否则<指的是存在C:>就执行显示C盘不存在。

注:if exist 意为如果存在,那么if not exist就是如果不存在。

你的C盘当然是实实在在存在的啦,根椐上面的中文分得知,那执行例18后就显示为:C盘不存在 通过分析例18,你应该明白if语句中not参数是怎么用了吧!

补充2:IF语句嵌套的写法

我们先来看看

例1

@echo off

set a=55

if %a% geq 50 (

if %a% geq 80 (

if %a% geq 100 (

echo a大于等于100

) else echo a小于100

) else echo a小于80

) else echo a小于50

pause

这是一种比较规范的写法,那这种写法是怎样写的呢?那我们一步步的来:

第一步:

if %a% geq 50 ( ) else echo a小于50

第二步:在第一步geq 50 后面的括号()里按两下回车,主要是空两行出来。

if %a% geq 50 (

if %a% geq 80 ( )else echo小于80

) else echo a小于50

第三步:在第二步geq 80 后面的括号()里按两下回车,主要是空两行出来。

if %a% geq 50 (

if %a% geq 80 (

if %a% geq 100 ( ) else echo a小于100

)else echo小于80

) else echo a小于50

第四步:在第三步geq 100 后面的括号()里按两下回车,主要是空两行出来。

if %a% geq 50 (

if %a% geq 80 (

if %a% geq 100 (

echo a大于等于100

) else echo a小于100

)else echo小于80

) else echo a小于50

上面的代码中,if %a% 和 )else 要适当的缩进,以达到写书清晰!

在批处理文件中:for %%I in (command1) do command2

in之后必须有空格,否则会出错。

1、for语句的形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,也就是说,%%I和%%i会被认为不是同一个变量;形式变量I还可以换成其他的字符,但是,为了不与批处理中的%0~%9这10个形式变量发生冲突,请不要随意把%%I替换为%%0 ~%%9中的任意一个;

2、in和do之间的command1表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为一个元素,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔;

3、for语句依次提取command1中的每一个元素,把它的值赋予形式变量I,带到do后的command2中参与命令的执行;并且每次只提取一个元素,然后执行一次do后的命令语句,而无论这个元素是否被带到command2中参与了command2的运行;当执行完一次do后的语句之后,再提取command1中的下一个元素,再执行一次command2,如此循环,直到command1中的所有元素都已经被提取完毕,该for语句才宣告执行结束;

例:

[code1]

@echo off

for %%I in () do echo %%I

pause

[code2]

@echo off

set str=c d e f g h i j k l m n o p q r s t u v w x y z

echo 当前硬盘的分区有:

for %%i in (%str%) do if exist %%i: echo %%i:

pause

[code3]

@echo off

for %%i in (*.txt) do echo "%%i"

pause

for /f 的基本用法

在for /f语句中,这里的元素是指文件中的每一行,也就是说,for /f 语句是以行为单位处理文本文件的。

[code4]

@echo off

for /f %%i in () do echo %%i

pause

delims=

"delims=,",它的含义是:以逗号作为被处理的字符串的分隔符号。

如果没有指定"delims=符号列表"这个开关,那么,for /f 语句默认以空格键或跳格键作为分隔符号。如果"delims=",等号后为空,则不会分割。但是空白行将被忽略。

for /f 语句默认只提取第一节的符串。

[code5]

@echo off

for /f "delims=," %%i in () do echo %%i

pause

[code6]

@echo off

for /f "delims=.," %%i in () do echo %%i

pause

定点提取:tokens=

tokens= 后面一般跟的是数字,如 tokens=2,也可以跟多个,但是每个数字之间用逗号分隔,如 tokens=3,5,8,它们的含义分别是:提取第2节字符串、提取第3、第5和第8节字符串。tokens=1,2,3,4,5 可以简写为 tokens=1-5 。

[code7]

@echo off

for /f "delims=, tokens=2,5" %%i in () do echo %%i %%j

pause

如果 tokens= 后面指定了多个数字,如果形式变量为%%i,那么,第一个数字指代的内容用第一个形式变量%%i来接收,第二个数字指代的内容用第二个形式变量%%j来接收,形式变量遵循字母的排序。

[code8]

@echo off

for /f "delims=, tokens=1,*" %%i in () do echo %%i %%j

pause

文本:尺有所短,寸有所长,学好批处理没商量,考虑问题复杂化,解决问题简洁化。

运行结果:尺有所短 寸有所长,学好批处理没商量,考虑问题复杂化,解决问

题简洁化。

tokens=后面所接的星号具备这样的功能:字符串从左往右被切分成紧跟在*之前的数值所表示的节数之后,字符串的其余部分保持不变,整体被*所表示的一个变量接收。即:第一节字符串被切分完之后,其余部分字符串不做任何切分,整体作为第二节字符串。tokens=1,*可写为tokens=1*

跳过无关内容,直奔主题:skip=n

[code9

@echo off

for /f "skip=2" %%i in () do echo %%i

pause

这段代码将跳过头两行内容,从第3行起显示中的信息。

忽略以指定字符打头的行:eol=

[code10]

@echo off

for /f "eol=;" %%i in () do echo %%i

pause

结果,那些以分号打头的行没有显示出来。eol= 的准确含义是:忽略以指定字符打头的行(只能忽略一个)。for /f 语句是默认忽略以分号打头的行内容的。

如何决定该使用 for /f 的哪种句式?(兼谈usebackq的使用)

1、for /f %%i in (文件名) do (……)

2、for /f %%i in ('命令语句') do (……)

3、for /f %%i in ("字符串") do (……)

为了兼容文件名中所带的空格或&,当路径中含有特殊字符的时候:

4、for /f "usebackq" %%i in ("文件名") do (……)

5、for /f "usebackq" %%i in (`命令语句`) do (……)

后引号`(键盘左上角esc键下面的那个按键,与~在同一键位上)。

6、for /f "usebackq" %%i in ('字符串') do (……)

计数循环:for /l

for /l 语句的完整格式是这样的:for /l %%i in (x,y,z) do (……),在这个语句中,x、y和z都只能取整数,正负皆可,x指代起始值,y指代步长,z为终止值,具体含义为:从x开始计数,以y为步长,直至最接近z的那个整数值为止,这之间有多少个数,do后的语句就执行多少次。for /l 会将参数中不为有效数字的项和缺失的项理解为 0,典型例子为 for /l %%a in () do echo 无限循环

[code11]

for /l %%i in (1,2,10) do echo bathome

在以上的代码中,初始值是1,步长为2,终止值为10,表明计数从1开始,每隔2个数计算一次,直至最接近10的那个整数,罗列出来,就是1,3,5,7,9,再下一个就是11,超过10了,不再计算在内,所以,do后的语句只执行5次,将连续显示5个bathome。

实际上,x,y和z的值可正可负,甚至为0,限制非常宽松:

1、步长y的值不能为0;

2、当步长y的值为正整数时,终止值z不能小于初始值x;

3、当步长y的值为负整数的时候,终止值z不能大于初始值x。

换而言之,必须保证in和do之间能取到一个有效的数组序列。

al enabledelayedexpansion

例1:

@echo off & setlocal EnableDelayedExpansion

for /f "tokens=* delims=" %%i in ("Hello world.") do (

set n=%%i

set n=!n:ld.=t!

set n=!n:o w= S!

set n=!n:He=Wi!

echo !n!

)

pause

执行后会显示“Will Sort”字符串。

当CMD读取for语句时,其后用一对圆括号闭合的所有语句将一同读取,并完成必要的预处理工作,这其中就包括环境变量的扩展,所以在for中的所有语句

执行之前,所有的环境变量都已经被替换为for之前所设定的值,从而成为一个字符串常量,而不再是变量。

而为了能够在for语句内部感知环境变量的动态变化,CMD设计了延迟的环境变量扩展特性,也就是说,当CMD读取了一条完整的语句之后,它不会立即执行变量的扩展行为,而会在某个单条语句执行之前再进行扩展,也就是说,这个扩展行为被“延迟”了。

总的来说是,在没有启用变量延迟的情况下,凡是在括号内(即do里面)的变量,在执行for语句之前,就已经被替换成for语句之前其它命令对该变量所赋予的值。

例2:

@echo off

for /f "tokens=* delims=" %%i in ("Hello world.") do (

set n=%%i

set n=%n:ld.=t%

set n=%n:o w= S%

set n=%n:He=Wi%

echo %n%

)

pause

执行结果是显示“ECHO 处于关闭状态”。

第一句set n=%%i能正常执行并达到它的目的,因为它只是单纯地将%%i的值赋予给变量n,所以没有任何问题。其它几句属这样情况:早在for语句执行前,CMD就急不切待地将这几句里面的所有变量n一同执行替换行为,替换为for之前,其它命令对n所设置的值,从而使n变成一个常量。但在本例中,for语句之前只有@echo off这句,并没有其它命令对n作过任何赋值行为,所以在for之前,变量n的值为空值。即是说,set n=%n:ld.=t% 这句里面的变量n,在CMD读取(注意是读取不是执行)完整个for语句后(这时还未轮到set执行自己的任务),就立刻被替换为一个空值,一个空值里面没有任何东西,所以就不存在一字符替换另一字符这种说法。

例3:这是个错误的例子

@echo off

set mm=girl&echo %mm%

pause

执行后依然显示“ECHO 处于关闭状态”。

原因是没有启用延迟,而且在set mm=girl&echo %mm%语句前没有其它命令对mm进行赋值。这时当CMD执行set mm=girl&echo %mm%语句前,就已经急不切待地把变量mm的值替换了,而又因为前面没给mm赋值,所以mm被替换为空值,变成常量。等到echo命令执行时,它其实是echo一个不会变化的常量,本例中即是空值。

总的来说是,如果不启用变量延迟,在本例中,echo是不会理会也不会知道,

它前面(指同一行语句)是否有其它命令给mm赋值。它只会从set

mm=girl&echo %mm%这句以上的语句中获取它所要显示的变量的内容,也就是说,上一行或上几行的命令将mm设置成什么值,echo命令就显示什么值。

set 变量嵌套变量

例:

@echo off

set a=1&set b1=10

call,echo %%b%a%%%

pause>nul

call 这里实际是对命令行进行重新组织扩展,先扩展%%b%a%%%里面的%a%,使%a%变成a的值1,再用cal来扩展%b1%。

也可以用变量延迟来实现,方法如下:

@echo off

set /a a=1,b1=10

Setlocal EnableDelayedExpansion

echo:!b%a%!

pause

call 在这里的用法实际是变量延迟的一种快捷方式,变量延迟一般用在for的循环体里面。

call,%%b%a%%% 这里的逗号实际是一个分隔符,和空格一样,还有很多分隔符可用,比如上例中的 echo:!b%a%! ,当然并不是所有的命令都可以这样用,看情况而定。

Q:为什么将连接两个set语句的&两边加个空格,即:set a=1 & set b1=10,运行结果A:为:ECHO 处于关闭状态?

加了空格,变量a的值就是1加上一个空格了,而不是原来单独的一个1。

附:转义字符%

为什么变量转义字符%%会只显示一个%

用ECHO命令显示“ %~dpI”问题,为什么编写批处理的时候必须用ECHO %%~dpI语句才能显示出“ %~dpI”这个呢?为什么用回显命令执行的时候只显示一个呢?

1、%是个ESCAPE字符,通常将之译为转义字符,但也有更形象的译名脱逸字符、逃逸字符等。也就是说%不仅仅将与其相关的特定字符串转义并替换为

特定字符串,而且自身也会被“脱逸”。而且类似于C语言中的转义字符"",双%会转义并脱逸为单%,四%则脱为双%。

2、for本身是一个特殊的命令,类似于一个特化的命令解释器,因为它的功能实现需要执行多条语句,因此它必须也具有对命令行(特指do后的命令行)分析处理的功能。而command/cmd实现for时自然会借用自身原有的命令行分析模块,因此for具有二级转义的特性,for中do后的语句被分两级分析和解释,第一级在command/cmd读入并解释for命令行时,第二级在for读入并解释do命令时,它通常会对同一命令行的进行多次解释。

然后,我们可以注意到,在do中使用命令行参数变量和环境变量时,不需要双%,那是因为,这些变量在经过第一级转义后,被替换成特定的不变的字符串常量,参与for循环的所有执行过程;而替代变量则要求在执行(do后的子命令行中)过程中不断的动态变化,而这个变化自然仍需要通过脱逸字符来实现,因此使用双%就是成了必然的选择。

另外,还需要注意到,在命令行中使用for时不需要双%,这源于命令解释器对命令行与批处理的处理方式不同。在早期的DOS版本中,%在命令行中不被视为转义字符,所以不会被转义和脱逸,所以当时无法在命令行直接引用环境变量。而使用for时,只需要一个%供for进行转义和脱逸就够了。在以后的命令解释器版本中,加入了命令行转义的支持(主要是环境变量的支持),但命令行for使用单%的传统仍然保留了下来。

而cmd中的变量延迟替换是属于特殊的情况,但不违背以上的转义原则,只是for中的环境变量不再是常量了。

除了for循环变量外,批处理变量的脱逸符要成对使用,就像数学四则运算的括号一样。

call set b=%%a:~0,%c%%%

最里面一对单%相当于四则运算里的小括号,外面的一对双%相当于中括号,再有3 个%就相当于大括号。

48.位运算符

位运算符是对于更小的单位——位,进行运算(1字节=8位)。

进行位运算符的学习,需要对2进制有所了解,懂得简单的 10进制 to 2进制 的相互转换,而且要对原码、反码、补码的概念有所了解。

10进制=(8位)2进制补码:

9=0000 1001

5=0000 0101

-9=1111 0111

1.按位与 运算符(&)

这里,为了方便后面的教学,我们暂且将1称为真,0称为假。

C:UsershelloworldDesktop>set /a 9^&5

1

C:UsershelloworldDesktop>set /a -9^&5

5

为什么写成^&?

跟前面的求余数运算符是一样的道理,由于&符比较特殊,所以需要转义(%必须由%转义,&必须要^转义)。

9和5、-9和5按位与的结果分别为1,5,Why?

位运算就是要用10进制数对应的二进制补码进行运算,然后再将运算得到的二进制补码换算成10进制数输出。

9: 0000 1001

&

5: 0000 0101

---------------------

1: 0000 0001

-9:1111 0111

&

+5:0000 0101

---------------------

+5:0000 0101

按位与运算,就是“同真为真,其余为假”,在同一位上都是1运算结果才是1,其余都是0。

2.按位或 运算符(|)

“|”符号在set /a 之外还有“管道”的用法,但是在set /a 中它只是按位或(由于|符号的特殊性,在运用时也要在前面加转义符——^|)。

C:Usershelloworld>set /a 5^|9

13

C:Usershelloworld>set /a 5^|-9

-9

9: 0000 1001

|

5: 0000 0101

---------------------

13: 0000 1101

-9:1111 0111

&

+5:0000 0101

---------------------

-9:1111 0111

按位或运算,就是“一真便真,全假才假”,同一位上只要一个是1,那结果就是1,只有全部是0,结果才是0.

结合前面的按位与(&)运算来看,其实按位与(&)和按位或(|)就是一种比较运算,比较同一位上的0或1的异同,得出结果。

3.逻辑移位

逻辑移位运算符有两个:<< ,>>,分别表示向左移位,向右移位。

向左移位(<<)

C:UsershelloworldDesktop>set /a 9^<^<2

36

9: 0000 1001

<<

2

---------------------

36: 0010 0100

把二进制补码向左移动两位(不足的在右边补零),然后换算成10进制数得出结果(向左移是将数变大)。

语法:set /a 被移数<<移位数

计算公式:结果=被移数*(2的移位数次方)

例如:9<<2 == 9*(2的2次方) ==36

向右移位(>>)

C:UsershelloworldDesktop>set /a 9^>^>2

2

9: 0000 1001

>>

2

---------------------

2: 0000 0010

把二进制补码向右移动两位(多余的剔除——这里剔除了最后一个1),然后换算成10进制数得出结果(向右移是将数变小)。

语法:set /a 被移数>>移位数

计算公式:结果=被移数/(2的移位数次方)

例如:9>>2 == 9/(2的2次方) == 2

逻辑移位运算符的特性可以加以利用,来计算数值的偶数倍、偶数半:

比如 9 的 2倍,即 Set /a 9^<^<1

比如 9 的 1/2,即 Set /a 9^>^>1

4.按位异或运算符(^)

按位异或运算符也是个特殊符号(转义符),所以在使用的时候也要转义(^^)。

C:UsershelloworldDesktop>Set /a 9^^5

12

C:UsershelloworldDesktop>Set /a -9^^5

-14

9: 0000 1001

^

5: 0000 0101

---------------------

12: 0000 1100

-9:1111 0111

^

+5:0000 0101

---------------------

-14:1111 0010

按位异或运算,就是“不同为真,相同为假”,相同位都是1或都是0,结果就是0,其余结果都是1.

5.复合位运算

结合前面的复合算术运算符和位运算符,复合位运算就不难理解。

例如:(&=)运算符

@echo off

Set n1=9

Set /a n1^&=5

echo %n1%

pause

结果为1。

所以,“n1^&=5”就相当于“n1=n1^&5”(“&”需要转义)。

同理,“ n1^^=5”就相当于“n1=n1^^5”;"n1^|=5"就相当于“n1=n1^|5”

"n1^<^<=2"就相当于“n1=n1^<^<2”.

位运算就在这里结束了,其中“! ~ - ”这三个 “一元运算符”都没有讲解。

6.逗号运算符

如果两个变量的值都是数字,而不是字符串,就可以用set /a 中的逗号运算符一次性赋值。

例子:

@echo off

Set /a a1=5,a2=5

echo %a1% %a2%

pause

结果:

5 5

如果变量值是字符串,用这种方法就会出错。

例如:

@echo off

Set /a a1=5,a2=5a

echo %a1% %a2%

pause

结果:无效数字。数字常数只能是十进制(17),十六位进制(0x11)或八进制(021)。

5

只输出了a1的值,a2没有输出,因为a2的值是字符串。

看起来像字符串的16进制数。

例如:

@echo off

Set /a a1=5,a2=0x15

echo %a1% %a2%

pause

结果:

5 21

“0x15”中0x是16进制数前缀(等于10进制数21)。

"015"中0是8进制数前缀(等于10进制数13)。

例子:

增加系统启动项(一般是把文件拖到开始菜单——程序——启动,实现开机自启动;删除开机启动一般是在 msconfig /4 中设置)

@echo off

echo 修改系统启动项

set /p girl=输入要添加的程序的名称:

set /p boy=输入该程序的完全路径:

reg add "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" /v %girl%

/d %boy% /f

例如:

@echo off

reg add "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" /v qq /d "F:腾讯软件" /f

参数详解:

REG ADD KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [/d Data] [/f]

KeyName [Machine]FullKey

Machine 远程机器名 - 忽略默认到当前机器。远程机器上

只有 HKLM 和 HKU。

FullKey ROOTKEYSubKey

ROOTKEY [ HKLM | HKCU | HKCR | HKU | HKCC ]

SubKey 所选 ROOTKEY 下注册表项的完整名。

/v 所选项之下要添加的值名。

/ve 为注册表项添加空白值名(默认)。

/t RegKey 数据类型

[ REG_SZ | REG_MULTI_SZ | REG_EXPAND_SZ |

REG_DWORD | REG_QWORD | REG_BINARY | REG_NONE ]

如果忽略,则采用 REG_SZ。

/s 指定一个在 REG_MULTI_SZ 数据字符串中用作分隔符的字符

如果忽略,则将 "0" 用作分隔符。

/d 要分配给添加的注册表 ValueName 的数据。

/f 不用提示就强行覆盖现有注册表项。

例如:

REG ADD ABCHKLMSoftwareMyCo

添加远程机器 ABC 上的一个注册表项 HKLMSoftwareMyCo

REG ADD HKLMSoftwareMyCo /v Data /t REG_BINARY /d fe340ead

添加一个值(名称: Data,类型: REG_BINARY,数据: fe340ead)

REG ADD HKLMSoftwareMyCo /v MRU /t REG_MULTI_SZ /d fax0mail

添加一个值(名称: MRU,类型: REG_MUTLI_SZ,数据: fax0mail00)

REG ADD HKLMSoftwareMyCo /v Path /t REG_EXPAND_SZ /d ^%systemroot^%

添加一个值(名称: Path,类型: REG_EXPAND_SZ,数据: %systemroot%)

注意: 在扩充字符串中使用插入符号 ( ^ )

这里出现了很多的新名词,有必要讲解一下这些新名词的含义,键名(项),值名(键名),值(键值);

例如:

reg add "HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun" /v

qq /d "F:腾讯软件" /f

其中,

HKLMSOFTWAREMicrosoftWindowsCurrentVersionRun就是“项”;

qq就是“键名”;可以自己设置。

F:腾讯软件就是“键值”;这里是我电脑上的完全路径,根据自己电脑本身的路径填写。

REG ADD HKLMSoftwareMyCo /v Path /t REG_EXPAND_SZ /d

^%systemroot^%

添加一个值(名称: Path,类型: REG_EXPAND_SZ,数据: %systemroot%)

注意: 在扩充字符串中使用插入符号 ( ^ )

上面这段引用的意思就是,在“键值”有特殊符号时,需要用^加以转义,要添加键值“%systemroot%”,就必须写成“^%systemroot^%”。

再以一个例子说明:

@echo off

title 信长之野望12pk改变窗口模式工具 by helloworld

set /p a=1.全屏2.窗口(输入1或者2):

if %a%==1 reg add "HKCUSoftwareKOEINobunaga12pk tcConfigs" /v FullScreen

/t REG_DWORD /d 1 /f && echo 信长之野望12pk将会以全屏启动

if %a%==2 reg add "HKCUSoftwareKOEINobunaga12pk tcConfigs" /v FullScreen

/t REG_DWORD /d 0 /f && echo 信长之野望12pk将会以窗口启动

pause>nul

语法:reg add 项 /v 键名 /t 键值类型 /d 键值 /f(强制执行)

结合前面的两个代码,其实不难看出,在reg add命令中,最常用的就是 /v /d

/f 三个参数,/value后跟键名,/data后跟键值,/force 表示强制执行。省略/t参数时,默认的键值类型为 REG_SZ

这里以reg add为基础,全面的解析reg命令:

注册表就是上面那么4个关键的东西:项、键名、键值类型、键值;4个以外,再无其它。因此,reg命令操作对象也就不过这4个东西,不管是add也好、delete也好、query也好,统统都是如此。

REG QUERY /? query(查询),用来查询具体的项、键名、键值。

例子:

::获取ie缓存文件夹位置

set zcb=

set hc=

set weizhi=

set "zcb=HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerShell

Folders"

for /f "tokens=1* delims=Z" %%i in ('reg query "%zcb%" /v cache') do set

"weizhi=%%j"

set "hc=%weizhi:~1%"

for /f "tokens=* delims= " %%i in ("%hc%") do set "hc=%%i"

echo ie缓存文件夹位置:%hc%

ie缓存文件夹位置,在windowsxp和windows7中的位置是有差别的,但是在注册表中存储“ie缓存文件夹位置”的地址却是一样的,某种意义上来说,注册表可以解决批处理的兼容性,换句话说, 就是利用reg命令可以解决批处理兼容性的问题!

REG ADD /? add(添加),用来添加具体的项、键名、键值。

REG DELETE /? delete(删除),用来删除具体的项、键名、键值。

REG COPY /? copy(复制),用来复制具体的项、键名、键值到另一个具体的项、键名、键值。

REG SAVE /? save(保存),用来保存具体的项、键名、键值,到以hiv为扩展名的文件中。(可以想象,必有一个还原hiv文件的reg子命令)

例子:

REG SAVE HKLMSoftwareMyCoMyApp c:

::将配置单元 MyApp 保存到c盘中的文件

REG RESTORE /? restore(还原),覆盖方式还原以hiv为扩展名的文件,到具体的项、键名、键值中。(跟reg save相对应)

例子:

REG SAVE HKLMSoftwareMyCoMyApp c:

项一直紧跟在子命令后面,不管什么reg子命令。

REG LOAD /? load(加载),追加方式还原以hiv为扩展名的文件,到具体的项、键名、键值中。(跟reg save相对应)

例子:

REG LOAD HKLMTempHive

将文件 加载到注册表项 HKLMTempHive

“restore等同于>,load等同于>>”——类似这样。

REG UNLOAD /? unload(卸载),将加载子命令load的操作删除。

例子:

REG UNLOAD HKLMTempHive

卸载 HKLM 中的配置单元 TempHive

REG COMPARE /? compare(比较),用来比较具体的项、键名、键值和另一个具体的项、键名、键值。

例子:

REG COMPARE HKLMSoftwareMyCoMyApp HKLMSoftwareMyCoSaveMyApp

将注册表项 MyApp 下的所有值跟 SaveMyApp 比较

REG EXPORT /? export(输出),用来保存具体的项、键名、键值,到以reg为扩展名的文件中。(常说的“备份注册表”就是这个了)

例子:

REG EXPORT HKLMSoftwareMyCoMyApp

将注册表项 MyApp 的所有子项和值导出到文件

REG IMPORT /? import(输入),有备份就有还原,export的逆操作。(不需要加项,会自动添加到具体位置)

REG IMPORT

从文件 导入注册表项

REG FLAGS /? flags(标识),密钥?

REG FLAGS HKLMSoftwareMyCoMyApp QUERY

显示密钥 MyApp 的当前标志。

扩展阅读:

1.注册表主要的根键。

注册表有5个根键,分别是(括号中表示该根键所掌管的数据——有遗漏,无错误):

HKEY_CLASSES_ROOT(已在计算机上注册的所有com服务器和与应用程序相关联的所有文件扩展名)

HKEY_CURRENT_USER(当前用户配置信息)

HKEY_LOCAL_MACHINE(该计算机对于任意用户的配置信息,掌管数据最多)

HKEY_USERS(系统默认用户配置信息)

HKEY_CURRENT_CONFIG(硬件配置文件信息)

其中,HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG都是HKEY_LOCAL_MACHINE的子项,分别对应于HKEY_LOCAL_MACHINESOFTWAREClasses、HKEY_LOCAL_MACHINESYSTEMCurrentControlSet

2.键值的数据类型。

[ REG_SZ | REG_MULTI_SZ | REG_EXPAND_SZ |

REG_DWORD | REG_QWORD | REG_BINARY | REG_NONE ]

字符串值

在注册表中,字符串值一般用来表示文件的描述、硬件的标识等。通常它由字母和数字组成,最大长度不能超过255个字符。通过键值名、键值就可以组成一种键值项数据,这就相当于、文件中小节下的设置行。其实,使用注册表编辑器将这些键值项数据导出后,其形式与INI文件中的设置行完全相同。

二进制值

在注册表中,二进制值是没有长度限制的,可以是任意个字节长。在注册表编辑器中,二进制以十六进制的方式显示出来。

DWORD值

DWORD值是一个32位(4个字节,即双字)长度的数值。在注册表编辑器中,您将发现系统会以十六进制的方式显示DWORD值,在编辑DWORD数值时,可以选择用十进制还是16进制的方式进行输入。


本文标签: 文件 命令 变量 显示 执行