CMD批处理命令入门(6)——常用的特殊字符
CMD批处理命令入门(6)——特殊字符
- 本章内容主要学习要点:
- 重定向符 `>、>>`
- 命令管道符 `|`
- 组合命令 `&`、`&&`、`||`
- 转义字符 `^`
- 变量引导符 `%`
- 界定符 `""`
本章内容主要学习要点:
>、>>
重定向符|
命令管道符&、&&、||
组合命令^
转义字符%
变量引导符""
界定符
重定向符 >、>>
>
重定向符, 意思是传递并且覆盖,它所起的作用是将运行的结果传递到后面的范围(后边可以是文件,也可以是默认的系统控制台,即命令提示符)。
例1
echo hello120 >1.txt
新建立文件 1.txt,内容为”hello120” (注意:行尾有一空格,文件后有一空行)
例2
(echo hello120)>1.txt #新建立文件 1.txt,内容为”hello120” (注意:行尾无空格,但文件后有一空行)
>1.txt echo hello120 #新建立文件 1.txt,内容为”hello120” (注意:行尾无空格,但文件后有一空行)
例3
>1.txt <nul set /p=hello120 或 >1.txt set /p=hello120<nul
#新建立文件 1.txt,内容为”hello120” (注意:行尾无空格,且文件后也无空行)
注意:
如果上面的例子中1.txt原来有内容的话,在使用了> 重定向符命令后,将会被新的内容覆盖掉,这个一定要注意!
>>
重定向符将命令的输出结果追加到其后面的设备中去。这个符号的作用和>
有点类似,但他们是有区别的 >>
是传递并在文件的末尾追加,而>
是覆盖。用法同>
一样的。
例1
echo hello120 >>1.txt
如果1.txt不存在,则新建立文件 1.txt
,内容为”hello120
”;如果1.txt
存在,则把内容为”hello120
”追加到其文末尾。
例2
echo hello> 1.txt
echo world>>1.txt
这时候 1.txt
内容如下:
hello
world
命令管道符 |
表示把在它之前的命令或语句的执行结果作为在它之后的命令或语句的处理对象,简而言之,就是把它之前的输出作为它之后的输入。
例1
tasklist | find /i "qq.exe" && taskkill /f /im qq.exe
将tasklist
(进程列表)用传递符"|"
传递给 find
命令,执行查找QQ
的进程。
例2
echo Y|rd /s c:\abc
通过管道命令|
将echo y
的结果传给rd /s c:\abc
命令,从而达到自动输入y
的目的。
注意,管道命令 |
的输入方法,shift
键 \
组合命令 &
、&&
、||
&
、&&
、||
为组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行。
&
符号允许同时执行多条命令,当第一个命令执行失败了,也不影响后边的命令执行。这里 &
两边的命令是顺序执行的,从前往后执行。
格式:第一条命令 & 第二条命令 [& 第三条命令...]
例1
dir z:\ & dir y:\ & dir c:\
以上命令会连续显示z,y,c
盘的内容,不理会该盘是否存在。
&&
符号允许同时执行多条命令,当碰到执行出错的命令后将不再执行后面的命令,如果一直没有出错则一直执行完所有命令。
格式:第一条命令 && 第二条命令 [&& 第三条命令...]
例2
dir z:\ && dir y:\ && dir c:\
这个命令和上面的类似,但区别是,前一个命令执行失败时,后边的命令就不会再执行了。
||
符号允许同时执行多条命令,当一条命令执行失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令。
格式:第一条命令 || 第二条命令 [|| 第三条命令...]
例3
tasklist | find /i "qq.exe" && taskkill /f /im qq.exe || echo 你开了QQ?我不信
通过&&
和||
两个符号可以认为把上例分成了三个命令:
第一个命令::tasklist | find /i "qq.exe"
第二个命令:taskkill /f /im qq.exe
第三个命令:echo 你开了QQ?我不信
这里我们分析一下,如果找不到QQ进程,即第一个命令执行失败,则 &&
不会执行第二个命令:taskkill
命令,由于taskkill
命令没有执行,视作第二个命令执行失败,则 ||
将会执行第三个命令:echo
命令。
如果找到QQ进程,即第一个命令执行成功,则 &&
将会执行第二个命令:taskkill
命令,由于第二个命令执行成功,||
将不会执行第三个命令:echo
命令。
★管道命令 | |
的输入方法,输入两次shift键 \
★组合命令和重定向命令、管道命令一起使用必须注意优先级。管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令。
思考:
把C 盘和 D 盘的文件和文件夹列出到a.txt
文件中。
你可能马上的写出了下面的命令:
dir c:\ && dir d:\ > a.txt
这样执行后a.txt
里只有D盘的信息!为什么?因为组合命令的优先级没有重定向命令的优先级高!所以命令在执行时将被分成两部分: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
转义字符 ^
一般而言,^
以转义字符的身份出现。
因为在cmd
环境中,有些字符具备特殊功能,如 >
、>>
表示重定向,|
表示管道,&
、&&
、||
表示语句连接……它们都有特定的功能,如果需要把它们作为字符输出的话,echo >
、echo |
……之类的写法就会出错——cmd
解释器会把它们作为具有特殊功能的字符对待,而不会作为普通字符处理,这个时候,就需要对这些特殊字符做转义处理:在每个特殊字符前加上转义字符^
。
因此,要输出这些特殊字符,就需要用 echo ^>
、echo ^|
、echo ^|^|
、echo ^^
……之类的格式来处理;
另外,此转义字符还可以用作续行符号。
例1
@echo off
echo 这是^
一个^
句子
Pause
为什么转义字符放在行尾可以起到续行符的作用呢?原因很简单,因为每行末尾还有一个看不见的符号,即回车符,转义字符位于行尾时就让回车符失效了,从而起到了续行的作用。
变量引导符 %
①当百分号成对出现,并且其间包含非特殊字符时,一般做变量引用处理,比如:%var%
、%str%
例1
@echo off
set str=abc
echo 变量 str 的值是: %str%
pause
在屏幕上将显示这样的结果:
变量 str 的值是: abc
按任意键继续...
②另外,百分号作为变量引用还有一种特殊形式,那就是对形式参数的引用,此时,单个百分号后面紧跟0~9这10个数字,如 %0、%1、%2 。。。%0
表示批处理文件本身,包括完整的路径和扩展名%1
至%9
表示第一个参数至第九个参数
例2
@echo off
if defined str goto next
set str=
set /p str=请把文件拉到本窗口后回车:
call "%~0" %str%
pause
:next
cls
echo 本批处理文件完整路径为:"%~0"
echo 拖到本窗口的文件完整路径为:"%~1"
goto :eof
③出现在 set /a
语句中时,表示两数相除取余数,也就是所谓的模运算,它在命令行窗口和批处理文件中的写法略有差异:在命令行窗口中,只需要单个的%
,在批处理文件中,需要连续两个百分号,写成%%
。
例如:在命令行窗口中,运行 set /a num=4%2
,则结果将显示0
,因为4
除以2
的余数为0
;
如果保存为批处理文件,则此语句将略有改变:
例3
@echo off
set /a num=4%%2
echo 4除以2的余数为 %num%
pause
④转义符号:如果要显示%
本身时,需要在前面用%
来转义。
例4
@echo off
echo 一个百分号:%%
echo 两个百分号:%%%%
echo 三个百分号:%%%%%%
pause
界定符 ""
①在表示带有空格或特殊符号的路径时常要用""
来将路径括起来。
例1
cd /d cd "d:\program files\^%*abc"
因为路径中带有空格和特殊符号,所以要用""
将路径括起来。
②表示其中的内容是一个完整的字符串。
例2
@echo off
set "var=abc 123"
echo %var%
pause
这里表示变量var
的值为字符串“abc 123
”。