中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]在()内的调用批处理
作者:
标题: [讨论]在()内的调用批处理 上一主题 | 下一主题
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『楼 主』:  [讨论]在()内的调用批处理

先给个示例
@echo off
for %%f in (test) do (
    echo echo test 2 >test2.bat
    test2.bat
    echo test 1
    del test2.bat
)
echo test 3
猜猜它的输出是什么?

  Quote:
test 2
test 1

这个test 1的出现让我又一次见识了()的威力

   此帖被 +5 点积分         点击查看详情   
评分人:【 plp626 分数: +4  时间:2008-1-25 10:28
评分人:【 zsldownload 分数: +1  时间:2008-1-25 16:54


2008-1-24 20:47
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  

写那么复杂干什么?

@echo off
for %%f in (test) do (
    echo test 2
    echo test 1
)
echo test 3

看样子只运行括号里面的,试了pause证实了^应该试FOR的缘故?

2008-1-24 23:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 3 楼』:  

你没明白我的示例要表达的意思

通常情况下
直接调用批处理是不会返回的
也就是说被调用的批处理之后语句不会执行

但是被当这些语句被()包含后
cmd的解释过程有些变化
在()之内的所有语句都被执行了

下面的代码也是同样的道理
这与for没有什么关系
@echo off
echo test 2 >test2.bat & test2.bat & echo test 1
echo test 3


2008-1-25 00:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 4 楼』:  

()内的命令被视为一行,处理时是一次性读取的,不带()时按文本行来读取
看来批处理中执行批处理默认为跳转

   此帖被 +1 点积分    点击查看详情   
评分人:【 zsldownload 分数: +1  时间:2008-1-25 16:53


2008-1-25 04:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 5 楼』:  

所谓的小问题背后有大学问.

看来,小测试能反应根本原理.

cmd总是整句解释执行,

我看括号里调用bat就等同于call子过程, 调完返回!



讨论下:
对复合句的预处理机制?
单进程?
不知道大家联系到什么?
还有变量的预处理机制?

考考大家:
不测试能直接说出下面代码的打印结果吗?
@echo off
echo %%%%a%
echo %%%%a%%
echo %%%%a%%%
echo %%%%%a%%
pause>nul


2008-1-25 11:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 6 楼』:  

和我想象的一样,优先处理转义符



2008-1-25 11:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 7 楼』:  



  Quote:
我看括号里调用bat就等同于call子过程, 调完返回!

二者并不等同
如果上述的代码换成call会输出test 3的
而直接调用并不会输出
也就是说调用后仍不返回
只不过因为()内的代码与调用代码同属一个整句
所以一同被执行了

2008-1-25 12:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 8 楼』:  

嗯,还是楼主细心,考虑的全面.学习

2008-1-25 13:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 9 楼』:  

这应是一个真正的bug
直接在批处理中执行一个批处理,执行时没有调用新的cmd来或子进程,而是占用了或跟旧批处理在平行子进程中,当新批处理执行完后类似:eof的状态将cmd的输入终止了

2008-1-25 14:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 10 楼』:  

everest79:

我在讨论()的特性
你却在讲调用批处理的bug

直接调用批处理不返回
不是一个bug
而是从DOS时代就存在的一个特性
这与直接调用其它类型程序文件并不相同
有时候我们很需要这个特性

2008-1-25 14:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 11 楼』:  

问一句:
为什么在bat中直接调用(不是call,而是直接输入要调用的batch的路径)bat会将进程转到要调用的bat,当被调用的bat结束后,"主"bat后面的语句不被执行
表达不好,拿代码说吧:
@echo off
echo echo 123 >1.bat
1.bat
pause
这个代码直接就一闪然后退出了(显示123)
而这个代码
@echo off
echo echo 123 >1.bat
1.txt
pause
它会显示"按任意键继续..."
莫非这还有个进程优先级之分...

2008-1-25 14:40
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 12 楼』:  



2008-1-25 15:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 13 楼』:  

你们令我失望了,有这么难吗?

2008-1-25 19:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: