标题: 引号在批处理中的特殊应用 [打印本页]
作者: 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、定义变量内容时,含有特殊字符;
先测试代码:
- @echo off
- set test=ok>
- pause>nul
复制代码
我们可以看到,这些代码执行有误,原因是 > 在批处理中是作为定向符(特殊符号)的,在这里不能作为普通字符传给变量test,如果要将它作为普通字符传给变量test,可以有两中办法:一是常见的转义(就是在特殊字符前加个 ^),二就是使用 引号,如将代码改为以下,即可:
- @echo off
- set "test=ok>"
- pause>nul
复制代码
这种方法在传递用户输入的变量时,用途比较广,因为你不知道用户究竟输没输入特殊字符,同时,他输入特殊字符的时候,也不可能还专门去加个 ^ ,所以为了防止程序意外(碰到用户输入特殊字符时)退出,往往写成这样的形式(示例):
- @echo off
- set /p EN=请输入:
- set "var=%EN%" %'/*======这里将用户输入的结果传给变量var=======%
- echo 你输入的是 "%var%"
- pause>nul
复制代码
3、参数中的应用;
不管是 批处理文件 本身的参数,还是标签的参数,他们都是以空格作为分割符的,这样就会产生一些问题。
举例说明,测试代码:
- @echo off
- call :msg ok
- pause>nul
- :msg
- echo %~1
复制代码
以上代码的标签 :msg 的作用就是显示传给它的字符,如这里 call :msg ok,就是显示ok(相当于echo ok),如果要显示“我是好人”,只需要 call :msg 我是好人 即可。
但是如果要它显示 “我是 好人”,你这样调用:call :msg 我是 好人,显示的结果却是 我是,因为批处理只将空格前面的“我是”传给标签 msg,如果我们一定要显示出 “我是 好人”,就要将代码改成这样(将 我是 好人用引号括起来):
- @echo off
- call :msg "我是 好人"
- pause>nul
- :msg
- echo %~1
复制代码
欢迎批评指正补充;
作者: novaa 时间: 2007-12-27 09:14
补充一下。如果有空格的时候没有加引号。会把参数分为几个- @echo off
- call :echo 我是 好人
- :echo
- echo %1
- echo %2
- pause
复制代码
显示
我是
好人
二是
- call :echo "我是 好人"
- :echo
- echo %1
- echo %~1
- pause
复制代码
看看结果
显示的分别是
"我是 好人"
我是 好人
说明%~1是去引号的内容。
而%1是不去引号
作者: 小竹 时间: 2007-12-30 15:26
- @echo off
- if a==a (echo AAAAA")
- pause
复制代码
怎么办?
作者: 小竹 时间: 2007-12-30 15:27
- @echo off
- echo aaaaa"&pause
- pause
复制代码
又怎么理解?
作者: 小竹 时间: 2007-12-30 15:28
- @echo off
- set var="""""
- (echo %var%)
- 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把“"”当成了特殊字符来处理,你可以把它转义来执行,测试代码:- @echo off
- echo aaaaa^"&pause
- pause
复制代码
或者,让“"”成双出现:- @echo off
- echo aaaaa""&pause
- 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
你好,我有如下代码,我也知道 有空格要加 引号,但是我加了引号,在实际 使用中,有 空格还是会导致只能取得空格前面的,- set /p gn=请拖入程序获取程序名:
- call :gf "%gn%"
- :gf
- set ee=%~nx1
- echo @echo off>file\a.bat
- echo rem 注册内容>>file\a.bat
- echo tasklist^|findstr /i "%ee%"^&taskkill /f /im "%ee%">>file\a.bat
- echo call "%ee%" >>file\a.bat
- echo :a>>file\a.bat
- echo set a=>>file\a.bat
- echo tasklist^|findstr /i "%ee%"^>nul 2^>nul^&^&set b==^|^|set a==>>file\a.bat
- echo if "%%a%%%%b%%"=="==" (>>file\a.bat
- echo rem 删除注内容>>file\a.bat
- echo cd..^&rd /s/q "%%~dp0">>file\a.bat
- echo del /q /f "%%~f0" 2>nul>>file\a.bat
- echo exit>>file\a.bat
- echo )else (>>file\a.bat
- echo ping 127.1 -n 2 ^>nul>>file\a.bat
- echo goto:a>>file\a.bat
- echo )>>file\a.bat
- goto ddd
复制代码
post&pid=1294&ptid=408]1#[/url] youxi01
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |