Windows中的批处理的常用符号介绍
1.@ 命令行回显屏蔽符
ECHO OFF可以关闭掉整个批处理命令的回显,但不能关掉ECHO OFF这个命令本身,现在我们在ECHO OFF这个命令前加个@,就可以达到所有命令均不回显的要求。
该符号在批处理中的作用是关闭当前行命令的回显,也就是不显示执行的是什么命令,只显示命令的结果!
2.> 重定向符 将>之前的命令执行的结果输出到>之后指定的设备或文件中去,特定的文件或标准输出(stdout--默认为系统控制台),若文件中有数据则覆盖。
>> 重定向符
需要显示的数据追加到指定的输出文件之中,而不覆盖原来的内容。
< 输入重定向
将输入信息来源重定向为指定的设备或文件,系统默认接收键盘输入。
>&将一个句柄的输出写入到另一个句柄的输入中
<&刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中
常用句柄0、1、2,未定义句柄3-9
其中的1与2都是代表某个数据流输入输出的地址(NT CMD 称之为句柄,MSDOS称之为设备)。
句柄0:标准输入stdin,键盘输入
句柄1:标准输出stdout,输出到命令提示符窗口(console,代码为CON)
句柄2:标准错误stderr,输出到命令提示符窗口(console,代码为CON)
其中的stdin可被<重定向,stdout可被>、>>重定向,而stderr在DOS下不可直接重定向,只有通过ctty或其它命令将系统控制权转交给其它设备的方式,来间接完成。
注意:如果用在 set /a 语句中,则>表示分组,>>表示逻辑移位。
Dos代码
@echo off
@rem echo 关闭命令显示,@关闭echo off本身的显示
rem ==============设置标题title=================
rem -使用该文件的名称作为标题
title 测试bat的文件(test.bat--重定向)
rem ===============重定向符>=====================
rem 将当前文件的内容输出到指定的文件tb.txt而非控制台
type d:/test/bak/tt.txt>d:/test/bak/tb.txt
rem 将特定的字符串"Hello China "(注意最后的空格)写入到指定的文件
echo Hello China >d:/test/bak/tc.txt
rem ===============重定向符>>====================
echo hello>d:/test/bak/td.txt
echo world>>d:/test/bak/td.txt
rem ===============重定向符<=====================
rem 重新设定当前时间
echo 2010-01-12>d:/test/bak/te.txt
date <d:/test/bak/te.txt
del d:/test/bak/te.txt
rem ===============重定向符<=====================
rem 如果e盘存在则将其下面的文件信息输出到te.txt 否则将错误信息输出到err.txt
dir e:/ 1>d:/test/bak/te.txt 2>d:/test/bak/err.txt
@pause
3.| 命令管道符
管道命令,将|之前的命令的输出作为|之后的命令的输入。
格式:第一条命令 | 第二条命令 [| 第三条命令...]
Dos代码
@echo off
@rem echo 关闭命令显示,@关闭echo off本身的显示
rem ==============设置标题title=================
rem -使用该文件的名称作为标题
title 测试bat的文件(test.bat--管道命令)
rem =================管道命令|===================
rem 将显示tom001 tom002
rm d:/test/bak/t001.txt
echo tom001>d:/test/bak/t001.txt
echo neil001>>d:/test/bak/t001.txt
echo tom002>>d:/test/bak/t001.txt
echo neil002>>d:/test/bak/t001.txt
echo jerry>>d:/test/bak/t001.txt
type d:/test/bak/t001.txt | find "tom"
@pause
4.^ 转义字符
对特殊符号"<",">","&"的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅把他们当成符号而不使用他们的特殊意义。
另外,此转义字符还可以用作续行符号。
Dos代码
@echo off
@rem echo 关闭命令显示,@关闭echo off本身的显示
rem ==============设置标题title=================
rem -使用该文件的名称作为标题
title 测试bat的文件(test.bat--转义字符)
rem =================转义字符^==================
rem 用来转义 输出hello china > d:/test/bat/t.txt
echo hello china ^> d:/test/bat/t.txt
rem 用来续行行 输出结果为 hellochinaluchunli
echo hello^
china^
luchunli
@pause
5.& 组合命令
允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行。
语法:第一条命令 & 第二条命令 [& 第三条命令...]
&& 组合命令
用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令
语法:第一条命令 && 第二条命令 [&& 第三条命令...]
这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行。
|| 组合命令
用这种方法可以同时执行多条命令,当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令。
语法:第一条命令 || 第二条命令 [|| 第三条命令...]
提示:组合命令和重定向命令一起使用必须注意优先级
管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令。
Dos代码
@echo off
@rem echo 关闭命令显示,@关闭echo off本身的显示
rem ==============设置标题title=================
rem -使用该文件的名称作为标题
title 测试bat的文件(test.bat--组合命令)
rem =================组合命令&==================
dir d:/test/aa & dir d:/test/all
rem k盘不存在 不影响命令执行
dir k:/ & dir d:/test/all
rem =================组合命令&&=================
rem k盘不存在 程序无法再执行
dir k:/ && dir d:/test/all
rem =================组合命令||=================
rem k盘不存在 执行错误 后面的dir才执行
dir k:/ || dir d:/test/all
rem ========结合使用组合命令和重定向命令========
dir c:/ & dir d:/ > d:/test/bak/t002.txt
rem 上述命令执行结果只有d盘下面的目录到t002.txt去了
rem c盘下面的目录并没有按照预想的输出,而是打印在了控制台上
rem 修改成为,分别进行输出
dir c:/ > d:/test/bak/t003.txt && dir d:/ >> d:/test/bak/t003.txt
@pause
6."" 双引号
双引号允许在字符串中包含空格。
cd "program files"
cd progra~1
cd pro*
以上三种方法都可以进入program files这个目录
7., 逗号
逗号相当于空格,在某些情况下","可以用来当做空格使。
如:dir,c:/
8.; 分号
当命令相同时,可以将不同目标用";"来隔离,但执行效果不变,如执行过程中发生错误,则返回错误报告。
如:dir c:/;d:/;e:/;f:/
Dos代码
@echo off
@rem echo 关闭命令显示,@关闭echo off本身的显示
rem ==============设置标题title=================
rem -使用该文件的名称作为标题
title 测试bat的文件(test.bat--分号)
rem ==============分号;=================
rem c d e f磁盘都存在,则正确执行,显示各磁盘下文件目录
dir c:/;d:/;e:/;f:/
echo ---------------------
rem z盘不存在则程序返回错误,对于d e f均不再执行
dir z:/;d:/;e:/;f:/
@pause
9.% 批处理变量引导符
表示参数,参数是指在运行批处理文件时在文件名后加的字符串。引用变量用%var%,调用程序外部参数用%1至%9等等。
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*为命令行传递给批处理的参数
%0 批处理文件本身,包括完整的路径和扩展名
%1 第一个参数
%9 第九个参数
%* 从第一个参数开始的所有参数
参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。
%%批处理变量引导符。
set str=abc
echo 变量 str 的值为%str%
%也可以作为转义字符
echo %% 输出一个%
echo %%%% 输出两个%
Dos代码
@echo off
@rem echo 关闭命令显示,@关闭echo off本身的显示
rem ==============设置标题title=================
rem -使用该文件的名称作为标题
title 测试bat的文件(test.bat--变量引导符)
rem ==============变量引导符%===================
rem %0 代表当前文件本身 输出路径名和文件名
echo %0
rem 可以通过%0来拷贝自身(将当前文件的内容拷贝到tt.txt中去)
copy %0 d:/test/bak/tt.txt
rem 可以通过设置参数来接受输入的变量,但是不能有空格
rem 如:set param001 = %1则取不到任何结果,只能为set param001=%1
rem 批处理接受参数,如:test.bat tom is boy
set param001=%1
set param002=%2
set param003=%3
rem 输出 tom is boy
echo %param001% %param002% %param003%
rem %只能接受%1到%9九个参数,若参数多云9个则无法接受,需使用shift命令,见shift命令讲解
rem % 与 %%的用法
rem =两端不可有空格
set str=abc
echo str 的值是 %str%
rem 以下分别输出一个% 两个% 三个%
echo %%
echo %%%%
echo %%%%%%
echo hello>d:/test/bak/t004.txt
echo china>>d:/test/bak/t004.txt
echo how>>d:/test/bak/t004.txt
echo are>>d:/test/bak/t004.txt
echo you>>d:/test/bak/t004.txt
rem 依次输出hello china how are you
for /f %%i in (d:/test/bak/t004.txt) do echo %%i
rem 依次输出a b c
for %%i in (a b c) do echo %%i
@pause
10.() 括号 小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。
括号在for语句和if语句中常见,用来嵌套使用循环或条件语句,其实括号()也可以单独使用。
注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题。
在for和if语句中属于语句格式的要求
例如:
for %%i in (语句1) do(语句2)
在这条语句中,语句1必须用括号对包围,而语句2的括号对则可视情况予以抛弃或保留:如果语句2是单条语句或用&、&&、||等连接符号连接的多条语句,括号对可以抛弃,如果语句2是有逻辑先后关系的多条语句集合,则必须保留括号对,并且,多条语句必须断行书写。
if 条件 (语句1) else (语句2)
如果没有else部分,则语句1的括号对可有可无;如果有else部分,则语句1中的括号对必须保留,此时,语句2中的括号对保留与否,和上一点类似。
Dos代码
@echo off
@rem echo 关闭命令显示,@关闭echo off本身的显示
rem ==============设置标题title=================
rem -使用该文件的名称作为标题
title 测试bat的文件(test.bat--括号)
rem ==================括号()====================
rem 输出1 2 3 每个单独占一行
echo 1 & echo 2 & echo 3
echo --------------
(
echo 1
echo 2
echo 3
)
@pause
11.! 感叹号
在变量延迟问题中,用来表示变量,即%var%应该表示为!var!,见setlocal介绍。
在set /a 一元运算符中表示逻辑非
12.: 冒号
任何以冒号:开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。
有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别,表示该行是一个标签,它之后的内容是一个标签段。
如:test,则表示:test之下的内容是标签段,而test是这个标签段的名,可以用 goto test 、goto :test 跳转 到该标签段或用call :test 调用该子过程。
在 set 语句中:和~同时使用时,:起到截取字符串的功能。
假设 set str=abcde,那么,set var=%str:~0,1% 表示截取字符串abcde的第一个字符;
和=同时使用时,起到替换字符串的功能。
假设:set str=abc:de,那么,set var=%str:a=1% 表示把字符串abc:de中的a替换为1
无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。
Dos代码
@echo off
@rem echo 关闭命令显示,@关闭echo off本身的显示
rem ==============设置标题title=================
rem -使用该文件的名称作为标题
title 测试bat的文件(test.bat--冒号)
rem ===================冒号:====================
rem 作为标签段
set num=3
set count=4
set /a flag=num+1
:: 关于判断相等若不加goto end则程序执行有问题
if %count%==%flag% goto begin
goto end
:begin
echo This is begin
:end
echo This is end
rem 截取/替换字符
set str=luchunli
set var001=%str:~2,7%
rem 输出 chunli
echo %var001%
set var002=%str:u=r%
rem 输出 lrchrnli
echo %var002%
@pause
13.:: 注释符号
表示该行内容为注释内容。:: 是个无效的标签名,:加上空格同样可以起到注释的作用。
::的功能和注释命令rem相同。
但是还有几点区别
(1)::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态。
(2)rem 注释语句中的某些命令符号如重定向符号和管道符号还是会执行,而如果用::来注释的时候,与::同处一行的所有命令或符号直接被命令解释器忽略掉,无形中提高了注释的兼容性和整个程序的执行效率,并且在众多的命令语句中更显得醒目,所以,注释语句推荐使用::的格式。
(3)rem 可以用于 config.sys 文件中。
Dos代码
rem ==============注释命令符号::=================
rem 以下两句都不会执行
rem tt>d:/test/bak/t.txt
:: ttb>>d:/test/bak/t.txt
14.~
和冒号(:)一起使用时起到截取字符串的功能。
在set /a语句中时,它是一元运算符,表示将操作数按位取反。
例如,set /a num=~1的执行结果是-2,set /a num=~0的结果是-1
用在for语句中,表示增强for的功能,能够提取到更多的信息。
例如:在批处理文件的for语句中:%%~i表示去掉第一对外侧引号,%%~zi表示获取文件的大小(以字节为单位),%%~ni表示获取文件名,%%~xi表示获取扩展名(带点号)……它们可以组合使用,如%%~nxi表示获取文件名和后缀名。
15.+ - * /
在 set /a 语句中,这些符号的含义分别为:加、减、乘、除。例如:set /a num=1+2-3*4/5。
需要注意的是,这些运算符号遵循数学运算中的优先级顺序:先乘除后加减,有括号的先算括号,并且,直接忽略小数点,因此,刚才那个算式的结果是1而不是0或0.6。
另外,有可能会在代码中看到这样的写法:set /a num+=1、set /a num-=1、set /a num*=1 和 set /a num/=1,这些表示累加、累减、累乘、累除,步长都是1,展开后的完整写法为:set /a num=num+1、set /a num=num-1、set /a num=num*1 和 set /a num=num/1(set /a 语句中,变量引用可以忽略百分号对或感叹号对,set /a num=%num%+1 与 set /a num=num+1 等同)
16.equ neq lss leq gtr geq
命令符号 含义 英文解释
EQU 等于 equal
NEQ 不等于 not equal
LSS 少于 less than
LEQ 少于或等于 less than or equal
GTR 大于 greater than
GEQ 大于或等于 greater than or equal
Dos代码
rem ==========equ neq lss leq gtr geq===========
set str001=tom
set str002=tom
rem equ 输出equal
if %str001% equ %str002% echo equal
17.点(.)和双点(..)
一个点代表当前目录;两个点代表上一级目录。
18.问号(?)
匹配任意一个字符
在路径中代表任意一个统配符
紧跟在/之后表示获取帮助,如if /? 和 set /?