[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

引号在批处理中的特殊应用

作者:[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
复制代码


欢迎批评指正补充;

回复 5# 的帖子

去掉代码中的 "()" 即可,否则有结构错误

TOP

回复 3# 的帖子

这里应该说,也存在语法错误,没必要使用 ( )
去掉括号,问题就解决了 或者去掉左边的 (

TOP

回复 4# 的帖子

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

TOP

回复 8# 的帖子

这个属于 bat 的语法范畴,它规定一定要那样用才对
如:if a==a echo yes
把它改成这样: if a=a echo yes
那它运行就出错拉,这个就是语法的问题

TOP

返回列表