标题: [推荐新手]谈谈批处理中引号的用法
[打印本页]
作者: lxmxn
时间: 2008-5-10 23:45
标题: [推荐新手]谈谈批处理中引号的用法
在批处理中用引号有点好处,就是可以增强代码的健壮性。大体可以用在下面这几个方面:
1、在含有空格的路径中使用引号。
文件和目录中含有空格的情况,注册表项的路径中含有空格的情况下都需要使用双引号。
比如我们要列出“C:\Program Files”目录中的文件和目录,直接用下面的命令是会提示找不到文件的:
dir /b C:\Program Files
可以用引号来包含含有空格的部分,这样就可以列出目录中的内容,一下几种情况应该都可以正常的输出内容:
dir /b "C:\Program Files"
或者省略最后面的引号:
dir /b "C:\Program Files
注意,如果此时最后面省略引号的话,必须保证后面没有空格,否则也会报错。
还可以这样:
dir /b C:\Program" "Files
甚至:
dir /b C:"\Program File"s
只要用成对的双引号将含有空格的部分引用起来就可以了。
第3种省略最后引号的情况有点特殊,这种情况下,在命令行末尾隐含有一个引号。比如:
echo "www.cn-dos.net | findstr cn-dos
并非显示的是“"www.cn-dos.net"”,而是显示的
"www.cn-dos.net | findstr cn-dos
2、在if条件判断的时候使用引号。
很多同学喜欢用这样的语句来判断一个变量和一个指定的字符串是否相等:
@echo off
set /p str=请输入字符串:
if #%str% == #cn-dos (echo %%str%% = cn-dos) else (echo error)
在这里,我强烈建议大家用双引号将比较的两个对象都引起来,如果不用双引号,此时如果用户输入的是一个含有空格的字符串(比如“cn dos”),此时就会报错了,而如果此处用的是双引号将“==”两边的对象引用起来,那么就算用户输入了含有空格的字符串也不会报错了。
3、使用find命令的时候使用引号。
使用find命令的时候必须使用双引号引用搜索字符,findstr可以不用引号,但是还是建议都用引号。
find 查找文件中的字符时,搜索字符和待搜索的文件参数位置可以颠倒,比如
find "echo" a.bat
和
find a.bat "echo"
的效果是一样的,都是在“a.bat” 文件中查找含有字符串“echo” 的行。
4、要显示一个含有特殊字符(& ||)的字符串时使用引号。
比如要在一个字符串中查找是否含有“&” 字符时用引号:
echo "!@#$%&&*()_\||" | findstr "&&" >nul && echo OK
5、在一些命令的参数中,也需要使用引号。
比如 tasklist 命令中的 /FI 的参数必须用引号括起。
tasklist /FI "PID le 1024"
搜索ProcessID小于等于1024的进程。
wmic 的 where 从句,三方工具 sed、grep、awk 的参数中,etc……
[
Last edited by lxmxn on 2008-5-11 at 01:30 AM ]
作者: nipo
时间: 2008-5-11 00:00
恩,归纳得很系统,谢谢!
作者: HAT
时间: 2008-5-11 04:36
很久不见版主发帖了,请教个问题:
在使用change.exe替换文本中的字符串时,如果要替换的字符串里面含有双引号该怎么办呢?比如我想把
ab"c"de替换成
ab'c'de
作者: lxmxn
时间: 2008-5-11 06:23
Quote: |
Originally posted by HAT at 2008-5-11 04:36:
很久不见版主发帖了,请教个问题:
在使用change.exe替换文本中的字符串时,如果要替换的字符串里面含有双引号该怎么办呢?比如我想把ab"c"de替换成ab'c'de |
|
可以试试用十六进制的形式来表示所要替换的字符。
change urfile.txt /from "&H22" /to "&H27"
作者: HAT
时间: 2008-5-11 07:22
十六进制的方法我在帮助里面也看到了,问题是十六进制和字符一起写好像会出错:
change a.txt /from "ab&H22c&H22de" /to "ab&H27c&H27de"
Quote: |
CHANGE pgm by Bruce Guthrie, (c)2001 U.S. Dept of Commerce Revised 03/10/2001
Input file: A.TXT /-S /ATTR=-H-S-R
Flag file: None created
Temp file: C:\TEST\{CHANGE}.TMP
Output file: Overwriting input file
Change from >ab"c"?, to >ab'c'?
Other settings: /I /BINARY /-TRIM /-ZAPNULL /-VERIFY
07:06:07: Reading C:\TEST\A.TXT --> C:\TEST\{CHANGE}.TMP
Bytes read: 7 Left: 0 Changes made: 0
No changes so keeping original file as it was: 7 bytes
07:06:07: Done |
|
是我的方法不对吗?
作者: bat-zw
时间: 2008-5-11 08:39
标题: 没道理不顶:
引号真是大有学问啊,谢谢版主的归纳,确实对新手是一大帮助,我项!!!
作者: lxmxn
时间: 2008-5-11 09:02
Quote: |
Originally posted by HAT at 2008-5-11 07:22:
十六进制的方法我在帮助里面也看到了,问题是十六进制和字符一起写好像会出错:
change a.txt /from "ab&H22c&H22de" /to "ab&H27c&a ... |
|
我这里直接用下面这个就成了:
change A.TXT /from ab"c"de /to ab'c'de
作者: regvip2008
时间: 2008-5-11 09:14
归纳得很好!!顶一个!
if #%str% == #cn-dos (echo %%str%% = cn-dos) else (echo error)
想请教下版主,上面这句中,#起到什么作用?谢谢!
作者: HAT
时间: 2008-5-11 09:54
Quote: |
Originally posted by lxmxn at 2008-5-11 09:02 AM:
我这里直接用下面这个就成了:
change A.TXT /from ab"c"de /to ab'c'de |
|
既有空格又有双引号该怎么办呢?
这样是不行的:
change A.TXT /from "a b"c"de" /to "a b'c'de"
作者: lxmxn
时间: 2008-5-12 20:08
Re regvip2008:
这里是为了防止 %str% 的值为空的时候 if 命令报错,也可以把“#”改为别的字符。
Re HAT:
那就直接用十进制的形式吧:
change urfile.ext /from a\032b"c"de /to a\032b'c'de
作者: HAT
时间: 2008-5-12 20:21
测试成功,多谢版主指点。