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

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

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

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

评分人数

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

本帖最后由 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

为什么不回过头来想想39楼提到的优先级呢?

TOP

返回列表