中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [推荐新手]谈谈批处理中引号的用法
作者:
标题: [推荐新手]谈谈批处理中引号的用法 上一主题 | 下一主题
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『楼 主』:  [推荐新手]谈谈批处理中引号的用法

在批处理中用引号有点好处,就是可以增强代码的健壮性。大体可以用在下面这几个方面:

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 ]

   此帖被 +11 点积分        点击查看详情   
评分人:【 nipo 分数: +2  时间:2008-5-11 00:00
评分人:【 plp626 分数: +5  时间:2008-5-11 00:02
评分人:【 wang6542975 分数: +2  时间:2008-5-11 00:18
评分人:【 regvip2008 分数: +2  时间:2008-5-11 09:10


2008-5-10 23:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nipo
中级用户





积分 228
发帖 106
注册 2008-4-26
状态 离线
『第 2 楼』:  

恩,归纳得很系统,谢谢!

2008-5-11 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 3 楼』:  

很久不见版主发帖了,请教个问题:

在使用change.exe替换文本中的字符串时,如果要替换的字符串里面含有双引号该怎么办呢?比如我想把ab"c"de替换成ab'c'de

2008-5-11 04:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  



  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"


2008-5-11 06:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 5 楼』:  

十六进制的方法我在帮助里面也看到了,问题是十六进制和字符一起写好像会出错:
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

是我的方法不对吗?

2008-5-11 07:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 6 楼』:  没道理不顶:

引号真是大有学问啊,谢谢版主的归纳,确实对新手是一大帮助,我项!!!



批处理之家新域名:www.bathome.net
2008-5-11 08:39
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 7 楼』:  



  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


2008-5-11 09:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
regvip2008
初级用户





积分 187
发帖 87
注册 2007-10-23
状态 离线
『第 8 楼』:  

归纳得很好!!顶一个!
if #%str% == #cn-dos (echo %%str%% = cn-dos) else (echo error)
想请教下版主,上面这句中,#起到什么作用?谢谢!

2008-5-11 09:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 9 楼』:  



  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"

2008-5-11 09:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 10 楼』:  

Re regvip2008:
这里是为了防止 %str% 的值为空的时候 if 命令报错,也可以把“#”改为别的字符。

Re HAT:
那就直接用十进制的形式吧:
change urfile.ext /from a\032b"c"de /to a\032b'c'de


2008-5-12 20:08
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 11 楼』:  

测试成功,多谢版主指点。

2008-5-12 20:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: