中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-15 12:47
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » [已结]批处理语句中的 2>nul 1>nul 是什么意思
可打印版本  31,415 / 57
第16楼 Scott0902 发表于 2006-05-11 14:00
中级用户 发帖 237 积分 466
第一次看到NUL有这种用法
第17楼 chineselgs 发表于 2006-05-11 16:18
高级用户 发帖 266 积分 613 来自 河南省
呵呵看了半天,就是不懂!~~
第18楼 arding 发表于 2006-05-12 13:17
初级用户 发帖 38 积分 90
Originally posted by chenall at 2006-3-26 14:38:
指定了2次句柄3当然无法同时使用了,把第二个改成echo. 1>nul 4>nul看看
确实可以.
恢复分别用echo 2>con 5>con , echo 1>con 6>con,若是只想栮..

我们讨论的对象中都出现了两个 > ,用i,j表示0到9的数字,如果将句柄看作指向设备的指针,则默认时:
句柄 指向
stdin con
stdout con
stderr con

当命令cnd i>nul j>nul 中的第一个>被执行时,系统将的目标暂存于未用的句柄空间,如,已备命令结束时恢复。然而,第二个>使得暂存的内容被修改,于是给后续命令留下了影响。
实际上,cnd i>nul j>nul 又会将的原内容暂存于再一个未用空间内,所以
cnd 2>nul 3>nul 对输出的改变,能够用cnd 2>&3 4>&3恢复回来。
由于暂存位置由系统选择,作为用户无法左右,所以数值不能肯定。
(我的每次试验为了保证句柄空间的确定,都是重新进入cmd.)
第19楼 willsort 发表于 2006-05-13 18:49
元老会员 发帖 1,512 积分 4,432
Re arding:

由于暂存位置由系统选择,作为用户无法左右,所以数值不能肯定


我在13楼中猜测,cmd将其修改前的句柄存放在“从未访问过的未定义句柄中(3-9)”。这里再明确一下,其中的“从未访问过”,是指在当前的cmd命令行中用户从未显式指定过,而并非cmd本身未使用过,而“从未访问过”的句柄可能有多个,而cmd会选择第一个。如果你有反面的例证,不妨提出。
第20楼 willsort 发表于 2006-05-14 17:15
元老会员 发帖 1,512 积分 4,432
Re arding:

我自己得到了反证,在执行了以下两句后,命令行仍然被屏蔽了。

echo test 3>nul
echo test 1>nul 3>nul

也就是说,我们尽管在第一句中已经访问了句柄3,但仍然可以在第二句中使用3>nul来改变备份的句柄stdout[1]。

因此,cmd的句柄备份策略可能是这样:首先使用未定义句柄3,如果检测到这个句柄处在备份状态时被改动,则换用下一个句柄。

另外还有一些发现:

1、cd 1>nul 2>nul 3>nul 4>nul 可以直接改变stdout和stderr的输出;
2、cd 0<nul 3<nul 或者 cd 0<nul 3>nul 将导致cmd不断回显命令行提示;
3、cd 0<nul 3<file 则直导致 cmd 窗口被关闭;
4、cd 1>nul 3>nul 后,cls 的行为也会失效,因此确证cls也是一种输出行为;

最后,关于句柄的复制,实际上可以理解为句柄的重定向,只是此次重定向的目标不再是设备或者文件,而是另一个句柄。

打个比方说,设备或文件是一个蓄水池,句柄就是其管道,命令则是管道上的水泵或者过滤器,而cmd就是一个自成一体的水循环系统。水池的管道从0-9编号,共有10条,0#管为进水管,1#管为排水管,2#管为故障测试管,3-9#管则是未使用的备用管。而0<实际上是打开进水管的阀门,1>则是打开排水管的阀门,而1>&2则打开将1#管到2#管的连接阀。而>nul的则是用水泵将水扬空。
第21楼 arding 发表于 2006-05-15 11:38
初级用户 发帖 38 积分 90
Re Willsort:
通过反复试验,可以猜测系统的句柄使用策略,比如
cnd 2>nul 3>nul 对输出的改变,能够用cnd 2>&3 4>&3恢复回来。
一句中的 4 便是猜测的结果,这也是基于刚刚进入cmd,句柄的使用情况比较清楚地情况下的猜测。
如果在一个批处理中反复使用了句柄重定向,则难以判断其句柄空间的情况,所以我说“系统决定,用户难以左右”。
我同意你的关于“未用句柄”的概念,测试也证实了这个概念。实际上,我感觉到明确的概念至关重要,反之则贻害无穷。就像windows帮助那些似是而非的说明,只会使人更加糊涂。
第22楼 weilong888 发表于 2006-10-12 08:00
银牌会员 发帖 548 积分 1,270
顶上去。
第23楼 pengfei 发表于 2006-10-12 09:47
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
经典, 又扩展思路了, 句柄重定向!
第24楼 soker 发表于 2006-10-12 10:15
初级用户 发帖 15 积分 30
看不懂啊~ 努力ing......
第25楼 qq82015930 发表于 2006-10-12 11:41
中级用户 发帖 109 积分 235
爱我还看不懂
第26楼 lxmxn 发表于 2006-10-12 13:34
版主 发帖 4,938 积分 11,386

两位实在是令人敬佩,但最终给人的感觉,还是没有明确说明句柄重定向的原理,尽管举了几个例子。
第27楼 electronixtar 发表于 2006-10-12 21:55
铂金会员 发帖 2,672 积分 7,493
知道有这回事就行啦。不懂的看Linux Shell入门
第28楼 jinnee 发表于 2006-10-14 03:41
新手上路 发帖 2 积分 8
看了这篇文章大长见识,不过还希能有高手来指点大家,顶一下
第29楼 jianyaogao 发表于 2007-03-17 20:29
初级用户 发帖 22 积分 49
深奥,理解中
第30楼 axi 发表于 2007-03-18 01:43
中级用户 发帖 93 积分 238 来自 GZ
哗!这些学识是从哪里学的呢,高深到极!
上一页  1 2 3 4  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023