Board logo

标题: 引号在批处理中的特殊应用 [打印本页]

作者: youxi01    时间: 2007-12-26 22:24     标题: 引号在批处理中的特殊应用

作者:[email=youxi01@bbs.bathome.net]youxi01@bbs.bathome.net[/email],转载请注明;

在批处理中,引号(")有时作为一个“特殊字符”的面貌出现,给批处理的编写还会造成一定的困扰,但是它在批处理代码编写的过程中又起到一些不可替代的作用,下面列举它的一些特殊使用。

1、含空格的文件名;
测试:先在F盘下新建一个文本文档(文件名为:新建 文本文档.txt),下面我们尝试用批处理来调用它,在命令行下,输入代码:start "" f:\新建 文本文档.txt,看看有什么提示?(会提示找不到 新建 文件),这是因为start命令在处理参数的时候,是以空格作为分隔符的,它只把"新建"作为参数传给了start命令本身,而F盘下又并没有这样的文件,所以会提示找不到。那我们如何通过命令行打开象 新建 文本文档.txt 这样含有空格的文件呢?我们可以这么办:把含有空格的文件名用引号括起来,如:

start "" F:\"新建 文本文档.txt"
或者start "" "F:\新建 文本文档.txt"
在用批处理处理处理 含有 空格 的注册表键时,有同样的应用方式;

2、定义变量内容时,含有特殊字符;
先测试代码:
  1. @echo off
  2. set test=ok>
  3. pause>nul
复制代码

我们可以看到,这些代码执行有误,原因是 > 在批处理中是作为定向符(特殊符号)的,在这里不能作为普通字符传给变量test,如果要将它作为普通字符传给变量test,可以有两中办法:一是常见的转义(就是在特殊字符前加个 ^),二就是使用 引号,如将代码改为以下,即可:
  1. @echo off
  2. set "test=ok>"
  3. pause>nul
复制代码

这种方法在传递用户输入的变量时,用途比较广,因为你不知道用户究竟输没输入特殊字符,同时,他输入特殊字符的时候,也不可能还专门去加个 ^ ,所以为了防止程序意外(碰到用户输入特殊字符时)退出,往往写成这样的形式(示例):
  1. @echo off
  2. set /p EN=请输入:      
  3. set "var=%EN%"  %'/*======这里将用户输入的结果传给变量var=======%
  4. echo 你输入的是 "%var%"
  5. pause>nul
复制代码

3、参数中的应用;
不管是 批处理文件 本身的参数,还是标签的参数,他们都是以空格作为分割符的,这样就会产生一些问题。
举例说明,测试代码:
  1. @echo off
  2. call :msg ok
  3. pause>nul
  4. :msg
  5. echo %~1
复制代码

以上代码的标签 :msg 的作用就是显示传给它的字符,如这里 call :msg ok,就是显示ok(相当于echo ok),如果要显示“我是好人”,只需要 call :msg 我是好人 即可。
但是如果要它显示 “我是 好人”,你这样调用:call :msg 我是 好人,显示的结果却是 我是,因为批处理只将空格前面的“我是”传给标签 msg,如果我们一定要显示出 “我是 好人”,就要将代码改成这样(将 我是 好人用引号括起来):
  1. @echo off
  2. call :msg "我是 好人"
  3. pause>nul
  4. :msg
  5. echo %~1
复制代码


欢迎批评指正补充;
作者: novaa    时间: 2007-12-27 09:14

补充一下。如果有空格的时候没有加引号。会把参数分为几个
  1. @echo off
  2. call :echo 我是 好人
  3. :echo
  4. echo %1
  5. echo %2
  6. pause
复制代码

显示
我是
好人
二是
  1. call :echo "我是 好人"
  2. :echo
  3. echo %1
  4. echo %~1
  5. pause
复制代码

看看结果
显示的分别是
"我是 好人"
我是 好人
说明%~1是去引号的内容。
而%1是不去引号
作者: 小竹    时间: 2007-12-30 15:26

  1. @echo off
  2. if a==a (echo AAAAA")
  3. pause
复制代码
怎么办?
作者: 小竹    时间: 2007-12-30 15:27

  1. @echo off
  2. echo aaaaa"&pause
  3. pause
复制代码
又怎么理解?
作者: 小竹    时间: 2007-12-30 15:28

  1. @echo off
  2. set var="""""
  3. (echo %var%)
  4. pause
复制代码
这个呢?
作者: youxi01    时间: 2007-12-30 16:12     标题: 回复 5# 的帖子

去掉代码中的 "()" 即可,否则有结构错误
作者: youxi01    时间: 2007-12-30 16:19     标题: 回复 3# 的帖子

这里应该说,也存在语法错误,没必要使用 ( )
去掉括号,问题就解决了 或者去掉左边的 (
作者: 小竹    时间: 2007-12-30 16:22

想知道这是为什么??
作者: youxi01    时间: 2007-12-30 16:26     标题: 回复 4# 的帖子

这个是著名的  单倍 " 的问题(双倍"则没有这样的结果),至于原因,我也不清楚.
可能bat跟vbs对一些字符的执行有些相似:就是要匹配(vbs中( 、"等都要成对出现,否则当是语法错误)
这里bat把“"”当成了特殊字符来处理,你可以把它转义来执行,测试代码:
  1. @echo off
  2. echo aaaaa^"&pause
  3. pause
复制代码
或者,让“"”成双出现:
  1. @echo off
  2. echo aaaaa""&pause
  3. pause
复制代码
运行结果如我们所料...
作者: youxi01    时间: 2007-12-30 16:27     标题: 回复 8# 的帖子

这个属于 bat 的语法范畴,它规定一定要那样用才对
如:if a==a echo yes
把它改成这样: if a=a echo yes
那它运行就出错拉,这个就是语法的问题
作者: neorobin    时间: 2009-12-10 22:25

就没见过微软超详细精确的命令行语法资料
中文版的命令行参考手册 ntcmds.chm 许多地方也是讲得稀里糊涂的, 甚至都有严重讲错了的.
作者: yunyan100    时间: 2016-7-17 10:34

回复 [url=http://bbs.bathome.net/redirect.php?goto=find
你好,我有如下代码,我也知道 有空格要加 引号,但是我加了引号,在实际 使用中,有 空格还是会导致只能取得空格前面的,
  1. set /p gn=请拖入程序获取程序名:
  2. call :gf "%gn%"
  3. :gf
  4. set ee=%~nx1
  5. echo @echo off>file\a.bat
  6. echo rem 注册内容>>file\a.bat
  7. echo tasklist^|findstr /i "%ee%"^&taskkill /f /im "%ee%">>file\a.bat
  8. echo call "%ee%" >>file\a.bat
  9. echo :a>>file\a.bat
  10. echo set a=>>file\a.bat
  11. echo tasklist^|findstr /i "%ee%"^>nul 2^>nul^&^&set b==^|^|set a==>>file\a.bat
  12. echo if "%%a%%%%b%%"=="==" (>>file\a.bat
  13. echo rem 删除注内容>>file\a.bat
  14. echo cd..^&rd /s/q "%%~dp0">>file\a.bat
  15. echo del /q /f "%%~f0" 2>nul>>file\a.bat
  16. echo exit>>file\a.bat
  17. echo )else (>>file\a.bat
  18. echo ping 127.1 -n 2 ^>nul>>file\a.bat
  19. echo goto:a>>file\a.bat
  20. echo )>>file\a.bat
  21. goto ddd
复制代码
post&pid=1294&ptid=408]1#[/url] youxi01





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2