[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
1# applba
  1. @echo off
  2. echo %123%
  3. pause
复制代码
  1. @echo off
  2. echo "123'
  3. pause
复制代码
  1. @echo off
  2. echo ^123
  3. pause
复制代码
这种特殊字符又怎么屏蔽呢?

TOP

echo命令不想set命令一样,set命令在运行时会去掉首尾的引号。

不知道你说的屏蔽是什么含义?是屏蔽他们的特殊作用?还是不显示他们?

TOP

31# hucuibai


用非常非常拐弯抹角的方法设为变量
http://bbs.bathome.net/viewthrea ... muid=30406#pid78640

TOP

1# applba
这几个符号的优先级 管道符号(|) 高于 输入输出重定向符号(< > >>) 高于 命令分隔符(&,&&,||)

这就是矫枉过正了
已确认包括 & | > < 都在同一个命令行预处理循环中
所以说他们的处理优先级是相等的
预处理结果只决定于它们出现的位置以及程序逻辑
这其中也包括对&& || >& <& 1> >> 等符号的处理
天的白色影子

TOP

29# applba
不记得谁说过:
for和if是高级语句,相当于一个命令解释器,他们能独立的对后面的语句块进行解释……

这句话我也很耳熟
但是这样的理解我认为过于极端了
for和if的特殊之处只在于
它们可以在语句中使用()
这意味着他们可能要在语句执行中
重新启动命令行的部分预处理功能
但是本质上仍然是语句块
仍然是在读入时就被预处理了大部分
真正的命令解释器仍然是cmd.exe
for 和 if 都不会开启新的cmd进程
除非使用 for /f 中的命令行语法
天的白色影子

TOP

32# applba


我的意思就是将这个字符打印成普通字符,或者不显示出来也可以
用set命令可以处理?

TOP

本帖最后由 applba 于 2011-5-19 21:41 编辑

34# qzwqzw

set "a=df&df67"
echo %a%|find "f6"

上面的用法肯定会出错,&把此语句分割。
我是据此来推断对&的特殊功能解释是先于|的。

当然了一楼的”高于“是我弄反了,实际上是低于。

TOP

37# applba


命令行的特点是从上到下、从左到右

TOP

36# hucuibai
恰恰相反,|的优先级高于&

from verybat(怀念之):
'%' >> '^' > '()' > '>、>>' > | > & > && > ||
%是顶级优先处理的,所以用“远远大于(>>)”

预处理时要判定语句的结构和功能。

当时zqz0012005、xzyx等高手把这些东西分析得非常深入透彻。
可惜很多技术、原理现在都忘了,后悔没有好好保存那些帖子,谁让verybat突然消失了呢?
1

评分人数

TOP

35# qzwqzw


我也这么认为,前面被那个比较有条理的说法吓倒了...仔细想想for和if确实是语块,比如:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "a b=."
  3. set "tmp=a b"
  4. echo for内:
  5. for %%a in ("a b") do if defined %%~a echo 存在“a b”
  6. ::正确
  7. echo;&echo 不使用变量延迟:
  8. (if defined a b echo 存在“a b”)
  9. ::出错
  10. echo;&echo 变量延迟:
  11. (if defined !tmp! echo 存在“a b”)
  12. ::正确
  13. echo;&pause
复制代码
我原来一直以为if defined是不支持空格变量名的,直到某天在某群里某个自以为是的家伙误打误撞写出来,我原以为会出错,结果一运行竟然没问题,这才发现原来if的条件语句是和整个语块一起进行划分的,也就是说,if不是一个语句,而是语块,for也是同样的情况,最有说服力的就是for循环中的for命令的开关、选项和参数是无法直接用变量修改的,这也证明了在语块划分完毕的时候,for语句的条件语句之前的部分也已经划分完了:
  1. for /f "tokens=!a!" ...
复制代码
众所周知这是会出错的
还有:
call if ...
call for ...
这两个都会出错,从错误提示来看,只能说明,for和if完全不是普通语句,而更可能是语块

TOP

36# hucuibai
恰恰相反,|的优先级高于&

from verybat(怀念之):
'%' >> '^' > '()' > '>、>>' > | > & > && > ||
%是顶级优先处理的,所以用“远远大于(>>)”

预处理时要判定语句的结构和功能。

当时zq ...
powerbat 发表于 2011-5-19 22:06


'>、>>' > | > & > && > ||?
重定向的优先级应该排在语句的连接符之后吧

TOP

以前不是有人说过for和if是“关键词”吗?

set n=3&for /l %%a in (1 1 !n!) do ...
是没问题的。
set n=3&for /l %%a in (1 1 !n!) do (... if %Got%==1 (set n=10) ...)
在循环体中改变循环条件是不行的。

TOP

以前不是有人说过for和if是“关键词”吗?

set n=3&for /l %%a in (1 1 !n!) do ...
是没问题的。
set n=3&for /l %%a in (1 1 !n!) do (... if %Got%==1 (set n=10) ...)
在循环体中改变循环条件是不行的。
powerbat 发表于 2011-5-19 22:24

如果for和if是语块这个命题成立,那么条件语句将是语块的一部分,而非语句的一部分,这就可以解释为什么在语块中无法重新定义for和if的条件语句了,因为它们的条件语句是和整个语块一起被预处理的

TOP

本帖最后由 powerbat 于 2011-5-20 00:24 编辑

'%' >> '^' > '()' > '>、>>' > | > & > && > ||
这个优先级应该没什么问题(当然我也没详细测试过)

set n=3&for /l %%a in (1 1 !n!) do ... //可以
set n=1&for /f "tokens=!n!" %%a in (循环集) do ... //不行
前者可以用延迟变量,说明for条件是在for命令被cmd执行时计算。而循环体中不能改变变量,则说明for计算条件只是在执行循环体之前处理一次。
后者可以认为是for /f 内部处理引号“从句”时,对tokens处理很简单,发现传给它的值是非数字就报错,没考虑值是变量的情况。

if的条件本来就只判断一次,何来改变?况且if的条件可以用延迟变量,说明if条件在预处理后还可以在if被cmd执行时才计算。
说for和if是“关键词”,因为它可以引导语句块。
其实不使用它们,单独用()把一组语句括起来,也是语句块,比如:
(echo a
echo b)>a.txt

TOP

猜想CMD把for /L 语句转换为C语言是类似这样的:
for /l %a in (start,step,end) do ...
==>
int i = 0;
int iStart = getenv("start");//假设for /L 的三个值都是变量
int iStep = getenv("step");
int iStop = getenv("end"); //在执行for之前已经把条件都确定了
for (i = iStart; i < iStop; i += iStep) {...} //在循环体中再怎么改变start,step,end,已经不影响for的条件了
1

评分人数

TOP

返回列表