DOS批处理中的特殊符号

常用特殊符号
1、@命令行回显屏蔽符
2、%批处理变量引导符
3、> 重定向符
4、>>重定向符
5、<、>、<& 重定向符
6、|命令管道符
7、^转义字符
8、组合命令
9、& 组合命令
10、||组合命令
11、/"/"字符串界定符
12、, 逗号
13、; 分号
14、() 括号
15、! 感叹号
 通配符(?和*)
常用来代替未具体指明的文件和数据。
?代表单个字符。
* 代表全部字符。

转义符  
用在特殊符号之前,取消特殊字符的作用.
比如:
echo 非常^&批处理 
连字符&在此命令中只当作一个字符显示到屏幕中
如果不加^ 那么"批处理"将被当作命令执行
| (管道)传递符
当然是传递作用,将前面一条命令的执行结果传递给后面一条命令继续执行.
比如:
echo 0123456 | find "123" 
将0123456 传递给find 查找 123
|| 连接符
当前面的命令没有成功执行 则执行后面的命令 可以作判断选择用.
比如:
echo 0123456 | find "789" || echo 字符中没有789
此命令的意思是在0123456中查找字符789,如果没有找到则继续执行后面的命令,
即在屏幕中显示"字符中没有789",如果找到了,也就是如果前面是0123456789的话则停止继续执行||后面的命令,而是在屏幕中直接显示"0123456789".
&&  连接符
当前面的命令成功执行 再执行后面的命令
比如:
echo 0123456 | find "123" && echo 字符中含有123
这个命令跟||刚好相反.
& 连接符
无论前面的命令是否成功执行 都执行后面的
比如:
echo 0123456 | find "789" & echo 字符中含有123
虽然没有成功到789 但还是会执行echo 命令
> 定向符
将输出的内容重定向到指定(文本中)
比如
echo 123456789>1.txt
输出字符串到1.txt中
如果是 >nul 则是输出到空设备中 起屏蔽屏幕输出的作用
比如
pause>nul  将命令的提示屏蔽掉
>> 定向符(追加)
将输出内容写入指定(文本中)
注意,">"将覆盖文本中原有内容
           ">>" 则是在文本的最后添加内容,
比如
echo 123>1.txt
echo 456>>1.txt
文本中有两行 分别是 123和456
如果echo 456>1.txt
那么 原有文本中的123将会替换成456
< 输入定向符
从指定的(文本)输入内容
一般用于set /p
比如 
echo 456>1.txt
set /p wind=<1.txt
这样 1.txt第一行内容就被赋值给wind了
本来set /p 这个命令是用来设置给用户输入字符的,但是=后用<1.txt,
意思是从1.txt文件中读取信息给SET /P ,而不需要用户输入.
很多人都知道,要正确处理路径中的空格,需要用引号把路径括起来,比如:md "c:\test abc\123"。实际上,只要文件路径中含有特殊字符,则引号对是必须的。
可能还有些人知道,要输出百分号本身,需要在它之前再添加一个百分号,比如,要显示 %abc% 这个字符串,应该写成 echo %%abc%%。
但是,当我们要输出>、<、|之类的特殊符号的时候,大多数人就开始绞尽脑汁了。
首先,我们要请出转义字符^,它能帮我们应付绝大多数的特殊字符。例如,我们要显示>,echo ^>即可;要显示|,echo ^|即可,也就是说,在每个特殊字符前加上转义字符^,就可以对特殊字符进行原样输出了。这次,你会原样输出 aueou>|&a^ueo 之类的字符串了吗?
但是,转义字符^也不能包打天下:当需要输出的是已知的一串或多行字符串的时候,确实可以在每个特殊字符前添加^来原样输出,可是,如果特殊字符的位置不确定,或是我们需要从某个文本中原样读出一串或多行可能含有特殊字符的未知字符串的时候,我们还能用插入转义符号^的办法吗?这显然是行不通的。
或许你已经意识到,就算是对含有特殊符号的路径用引号对括起来以保证处理它的时候不至出错,但是,当要用echo语句显示这个路径的时候,引号对还是会显示出来,这个多余的引号对并不是我们需要的,有时候甚至是我们无法容忍的。
转义字符^无用武之地,引号对也行不通,难道我们就这样彻底绝望了吗?
这次,该for语句隆重出场了。
先看示例:


    
@echo off for / f " delims= " %%i in ( test . txt ) do ( set " str=%%i " setlocal enabledelayedexpansion echo . !str! endlocal ) pause

test.txt内容如下(已经囊括了特殊字符):
aoueoa & aeo"83
aeouoaeA3ua^|!:>
><||a6^$2oueo
%ae!aoue

在这里,我动用了各种手段以保证特殊字符能够原样显示:
① 用 "delims=" 避免取到的字符串从空格处被截断;
② 用 set "str=%%i" 这样的引号对写法保证把字符串原样赋予变量 str ;
③ 在适当的位置开启变量延迟并在合适的地方终止变量延迟,以保证能原样显示变量 str 的值。在这一点上,很多人,包括很多熟练使用 setlocal enabledelayedexpansion 语句的人,都会忽略一些技术细节,从而不能100%原样显示变量 str 的值:我发现,绝大多数的批处理老鸟,都喜欢在@echo off和for语句之间使用 setlocal enabledelayedexpansion 语句,这是个非常不好的习惯——如果变量的值中含有半角感叹号的话,感叹号将被直接抛弃!正确的做法是:在for语句内部而不是外部开启变量延迟,并在合适的地方用endlocal语句终止延迟——endlocal一定要添加上,这是个好习惯,否则,当 setlocal enabledelayedexpansion 被执行32次之后,将会报错,从而引发后续处理错误。
当然,就算我动用了这么多手段,也不能保证能处理文本中的所有特殊情况:当行首为分号的时候、当存在空行的时候……
如果要处理所有的特殊情况,请使用如下代码:

    
@echo off cd .> output . txt for / f " delims= " %%i in ( 'findstr / n . * test . txt' ) do ( set " var=%%i " setlocal enabledelayedexpansion set var = !var:*: = ! ( echo . !var! )>> output . txt endlocal ) start output . txt

转载于:https://my.oschina.net/jacobin/blog/157614

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值