当前位置:DOS资源站资料中心批处理教程 → 复合语句内部子语句的括号问题

复合语句内部子语句的括号问题

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2008-5-12 15:25:43

先看几个会产生问题的例子,这几例都含有子语句:
1、

for /f "tokens=1-4" %%a in ("1 2 3 9") do (
set /p anwser=请输入答案:
set /a result=(%%a+%%b)/%%c
if %anwser%==%result% echo 100分
)
2、

set /p n=请输入QQ号:
if %n%==10001 (
echo 你好,马总!(你真是马总吗?)
start http://www.cmdos.net
) else rem do something else
3、

if 1==1 (
start /w /min mshta vbscript:createobject("wscript.shell").run("notepad")(window.close)
)
4、

@echo off
(echo dim ws
echo set ws=WScript.CreateObject("WScript.Shell")
echo ws.run "notepad")>test.vbs
运行结果分别出现
第一例:此时不应有 /%c。
第二例:不管输入是否为10001,都会打开http://www.cmdos.net
第三例:此时不应有run("notepad")(window.close)。
第四例:在命令行上显示了dim ws
set ws=WScript.CreateObject("WScript.Shell"
而test.vbs里面只有ws.run "notepad")

解决办法是:


在子语句的反括号“)”前面加上转义符号^,即写成“^)”

原因:如果子语句本身是一个复合语句(比如if、for之类),则它的反括号“)”会被正确保留。
但如果子语句本身不是一个复合语句,却含有反括号“)”,则它的“)”会被当成复合语句的结束标志。