@
关闭命令行回显符号
,
放在命令行前面
,
可以屏蔽命令行本身。
%
严格来说
,
这个符号算不上命令
,
它只是批处理中的参
数而已
(
多个
%
一起使用 情况除外
)
。这个符号非常特殊
,
用法复杂。
|
命令管道符
把前一命令的输出结果当后一命令的输入参数来使用。
格式
:
第一条命令
|
第二条命令
| [|
第三条命令
......]
例如
:
dir C:\ | find "e"
这个命令的执行结果为
:
在
C
盘查找
,
列出其中包含
e
字符的所有
文件和文件夹。
再例如
:
在不使用
format
的自动格式化参数时
,
可以这样来自动格式化
A
盘
echo y|format a: /s /q /v :system
用过
format
的都知道
,
再格式盘时要输入
y
来确定是否格盘
,
这个
命令前加上
echo y
,
并用
|
字符来将
echo y
的结果传给
format
命令
,
从而达到自动输入
y
的目的。
(
此命令有危险性
,
测试请慎重
!
)
>、>>
这两个命令都是输出重定向符
,
就是把前面命令
的输出写入到一个文件中。这两个命令的唯一区别是
,“
>
”
会清除掉
原有文件中的内容后 把新的内容写入原文件
,
而
“
>>
”
追加新的内
容到原文件末尾
,
不会改动其中的原有内容。
程序举例
:
if /? > if.txt
执行上面代码后
,
将在本文件所在目录产生一个名为
if
的
txt
文件
,
里面记录
if
的所有帮助内容。
如果输出的文件名含有空格
,
那么文件名就需要用双引号括起来
:
reg add /? >"reg add".txt
reg add /? >"reg add.txt"
上面这两种格式都是可以的。
如果要将某个变量写入文件
,
就要借助
echo
了。
程序例子
:
@echo off
set num=
123
echo %num%>>D:\num.txt
上面是输出到指定路径的例子。
程序例子
:
@echo off
echo Hello World!>file.doc
格式细节注意
:
上面的的
“
Hello World!
”
与
“
>
”
之间没有空格
,
那么输出的
“
Hello World!
”
末端也没有空格。如果上面的的
“
Hello
World!
”
与
“
>
”
之间有空格
,
那么输出为
“
Hello World!
”,
也有
空格。
而
>
或者
>>
与
file.doc
之间有无空格都无所谓。
程序例子
:
for /l %%i in (
1
,
1
,
100
) do set /p var=%%i<nul>>num.txt
将
1
到
100
连续不间断写入文本文档
num.txt
中。
<
输入重定向命令
,
从文件中读入命令输入
,
而不是从键盘中读
入。
例如
,
D
盘里有一个名为日期的
txt
文件
,
并且文件里的内容为
:
2013-06-09
那么执行下面的批处理
:
@echo off
date < D:\
日期
.txt
这样就可以不用等待而直接将当前日期修改为
2013
年
6
月
9
日。
>&
将一个句柄的输出写入到另一个句柄的输入中。
<&
刚好和
>&
相反
,
从一个句柄读取输入并将其写入到另一个句柄
输出中。
^
转义字符
是
<
、
>
、
&
这三个符号以及回车的前导符
,
作用是将
<
、
>
、
&
这三个
符号的特殊功能和回车去掉
,
仅仅把它当成符号而不使用它们的特殊
意义。
例如
:
echo abc^>tmp.txt
结果是在窗口中显示
abc>tmp.txt
没有将
“
abc
”
内容写入
tmp.txt
,
而是将
“
abc
”
连同一个空格一起
写入到
tmp.txt
文件里。
注意
:
^
与
>
之间不可以有空格
,
否则无法转义。如果
“
abc
”
与
“
^
”
之间有空格
,
这个空格会当做字符一并显示出来。
“
>
”
与
“
tmp
”
如
果有空格
,
同样这个空格也会被当做字符一并显示出来。
如果有括号包含
set /a
计算表达式
,
表达式也有括号
,
那么表达式的
括号必须用转义字符
,
否则会显示括号不成对
:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (
1
,
1
,
10
) do (
set /a var=(%%i+
1
^)*
2
echo !var!
)
pause
注意到上面
set /a var=(%%i+
1
^)*
2
括号有一个转义字符。
输出
“
^ > >> & && | ||
”
要借助转义字符。另外
,
在延迟变量的情况
下输出感叹号
,
则需要连续使用两个转义字符
:
@echo off
echo ^^
echo ^>
echo ^>^>
echo ^&
echo ^&^&
echo ^|
echo ^|^|
pause
@echo off
setlocal enabledelayedexpansion
echo ^^!
pause
转义字符高级篇
:
转义字符用于续行
@echo off
echo
中
^
华人
^
民
^
共和国
pause
窗口显示
:
中华人民共和国
按任意键继续
...
注意
,
最后的
“
共和国
”
后面不要加转义字符
,
否则
pause
也被续上
去了。另外
,
^
后面不要有空格
,
否则达不到续行的作用。为什么转
义字符放在行尾可以起到续行符的作用呢
?
原因很简单
,
因为每个行
尾都有一个看不见的符号
,
即回车符。转义字符位于行尾时
,
就让回
车符失效了
,
从而起到续行的作用。但是
,
由于
echo
可以显示多达
8184
个字符
,
所以嘛
,
用转义字符来续行徒增麻烦
,
用处不大。
&
组合命令
它的作用是用来连接
n
个
DOS
命令
,
并把这些命令按顺序执行
,
而
不管是否有命令执行失败。
语法
:
第一条命令
&
第二条命令
[&
第三条命令
...]
程序例子
:
dir Z:\&dir Y:\&dir C:\
以上命令会连续显示
Z
、
Y
、
C
盘内容
,
不理会该盘是否存在。
格式细节
:
dir
是关键字
,
后面一定要有空格。而其余地方有无空格
都无所谓。当然
,
我们这样写也是可以的
:
dir Z:\ & dir Y:\ & dir C:\
这样明朗一点。
copy a.txt b.txt /y & del a.txt
这里
&
两边的命令是有执行顺序的
,
从前往后执行。
&&
组合命令
这个命令也是把它前后两个命令连接起来
,
并按这些命令
的顺序执行。与
&
命令不同之处在于
,
它在从前往后依次执行被它连
接的几个命令时会自动判断是否有某个命令执行出错
,
一旦发现出错
后将不继续执行后面剩下的命令。
语法
:
第一条命令
&&
第二条命令
[&&
第三条命令
...]
程序例子
:
dir Z:\ && dir Y:\ && dir C:\
程序执行到
dir Z:\
,
显示
“
系统找不到路径
”
后就不执行后面的命令
了。
||
组合命令符
语法
:
第一条命令
||
第二条命令
[||
第三条命令
...]
用这种方法可以同时执行多条命令
,
当一条命令失败后才
执行第二条命令
,
当碰到执行正确的命令后
,
将不执行后面所有的命
令。如果没有出现正确的命令
,
则一直执行完所有的命令。
提示
:
组合命令和重向命令一起使用必须注意优先级
,
管道命令的优
先级高于重定向命令
,
重定向命令的优先级别高于组合命令。
程序例子
:
问题
:
把
C
盘和
D
盘的文件和文件夹列出到
a.txt
文件中。
dir C:\ && dir D:\ > a.txt
这样执行后
,
a.txt
里只有
D
盘的信息
!
为什么
?
因为组合命令的优
先级别没有重定向命令的优先级别高
!
所以这句在执行时将本行分成
这两部分
:
dir C:\
和
dir D:\>a.txt
,
而并不是你想的这两部分
:
dir C:\ && dir D:\
和
>a.txt
。要使用组合命令
&&
达到题目的要求
,
必须这么写
:
dir C:\> a.txt && dir D:\ >>a.txt
这样
,
根据优先级别的高低
,
DOS
将把这句话分成下面两部分
:
dir C:\
>a.txt
和
dir D:\>>a.txt
。
当然
,
这里还可以用
&
命令
:
dir C:\ >a.txt & dir D:\ >>a.txt
""
双引号是字符串界定符
表示双引号内的内容界定为字符。
常用于文件、文件夹名字带空格的情况
,
以及表示字符串。
另外
,
我们在
if
语句里
,
比较两个变量时
,
有时用双引号可以对程序
的健壮性有很大好处。
例如
:
@echo off
set /p choose=
请选择
(Y/N)
:
if /i "choose"=="Y" (echo Yes) else (echo No)
pause
这里
,
如果我们不用双引号
,
那么假如我们读入的数据是一个回车
,
那么程序就会出错而自动退出。有双引号
,
则输入回车
,
输出为
No
。
比较两个数字时
,
如果用双引号
,
那么计算机就会认为它们不再是数
字
,
而作为字符来比较。
例如
987
比
1234
小
,
但
"
987
"
会比
"
1234
"
大。测试代码如下
:
@echo off
set A=
987
set B=
1234
if %A% gtr %B% (echo A
大于
B) else (echo A
小于
B)
if "%A%" gtr "%B%" (echo "A"
大于
"B") else (echo "A"
小于
"B")
pause
例子
:
C:\>dir "program files"
要用双引号才有效
,
因为文件名
“
program files
”
存在空格。
字符界定符高级篇
:
假如两个字符串没有包含任何内容
,
就表示空值
,
这个可以用来判断
某个变量的值是否存在
!
测试代码
:
@echo off
if "%A%" equ "" (echo A
是空值。
) else (echo A
值不是空值
,
A
值
等于
%A%)
set /p A=
请输入
A
值
:
if "%A%" equ "" (echo A
是空值。
) else (echo A
值不是空值
,
A
值
等于
%A%)
pause
当然
,
用
if
的
defined
也可以判断字符是否存在
,
详见
if
命令。
,
逗号相当于空格
,
在某些情况下可以当做空格使用。
程序例子
:
@echo off
echo,Hello world!
start,iexplore.exe
dir,E:\
pause
程序可以执行。但这种写法很邪恶
,
应该摒弃。
对于
set /a
语句
,
可以连续赋值多个变量
:
@echo off
set /a X=Y=Z=
0
echo x=%X% y=%Y% z=%Z%
set /a x+=
1
,y*=
2
,z
-
=
0
echo x=%X% y=%Y% z=%Z%
pause
;
分号
当命令相同时
,
可以将不同目标用分号隔离
,
执行效果不变。
此符号属于旁门左道
,
不宜采用
!
程序例子
:
dir c:\;d:\;e:\;z:\
pause
上面命令相当于
dir C:\
dir D:\
dir E:\
dir Z:\
pause
而如果没有
Z
盘存在
,
则所有
dir C
、
D
、
E
盘都不会执行
,
后面如
果还有命令
,
也不会执行。
语法细节
:“
dir c:\;d:\;e:\;z:\
”
指令
,
分号与别的字符间可以有空格
,
也可以没有空格。
程序例子
:
dir C:\;D:\;E:\adobe\;F:\
假若
E
盘不存在名字为
adobe
的文件夹
,
程序仍然会执行
dir C
、
D
、
F
盘
,
只是执行到
E
盘后找不到
adboe
文件夹
,
会提示
“
找不到文件
”
。
结论
:
对于
dir
命令
,
如果目标驱动器不存在
,
则所有命令都不会执
行。如果驱动器存在
,
仅文件或文件夹不存在
,
所有有效的命令都会
执行。
再看一个例子
:
假如我们的
qq.exe
和
qqgame.exe
的路径分别为
D:\Tencent\QQ\Bin\qq.exe
和
D:\Tencent\QQGame\qqgame.exe
,
那
么下面程序
:
@echo off
start D:\Tencent\QQ\Bin\qq.exe
start D:\Tencent\QQGame\qqgame.exe
pause
程序可以正常执行。但如果用分号修改为
:
start D:\Tencent\QQ\Bin\qq.exe;D:\Tencent\QQGame\qqgame.exe
则程序无法执行。程序修改为
:
start D:\Tencent\QQ\Bin\qq.exe ; D:\Tencent\QQGame\qqgame.exe
这个程序和上面程序的区别仅仅是分号前后各添加了空格
,
程序可以
执行
,
但只打开了
qq.exe
,
后面的没有执行。
再举一例
:
@echo off
set a=
123
;b=
456
echo %a%
echo %b%
pause
这个程序根本不会将
456
赋值到
b
,
而
a
的值就是
“
123
;b=
456
”
。
结论
:
对于
set
,
分号无效。
set
语句要用逗号
:
set /a a=
123
,b=
456
,
在这里
,
逗号是必须的
,
而且还不能用空格。
结论
:
分号存在的意义不大
,
尽可能不要用分号。
( )
左右括号必须成对使用
,
括号中可以包含多行命令
,
这些
命令将被看成一个整体
,
视为一条命令行
,
即复合语句。此时
,
如果
要用到括号里的代码动态实时值
,
就需要用到延迟变量了。
例如
:
echo
1
& echo
2
& echo
3
可以写成
(
echo
1
echo
2
echo
3
)
例子二
:
@echo off
setlocal enabledelayedexpansion
set var=
0
(
set /a var+=
1
echo var
1
=%var% var
2
=!var!
)
pause
输出结果为
:
第一个
var
等于
0
,
第二个
var
等于
1
。
从上面可以看出
,
有了括号后
,
要实时得到变量的动态值
,
就必须用
延迟变量。
!
感叹号在变量延迟问题
(setlocal enabledelayedexpansion)
中
,
用来表示变量。即
%var%
变成
!var!
。详见延迟变量专题
setlocal
enabledelayedexpansion
。