中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 03:55
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]批处理语句中的 2>nul 1>nul 是什么意思
16 发表于 2006-05-11 14:00 ·  中国 广东 广州 天河区 电信
中级用户
★★
积分 466
发帖 237
注册 2005-10-12 20:53
UID 43413
状态 离线
第一次看到NUL有这种用法
17 发表于 2006-05-11 16:18 ·  中国 福建 泉州 电信
高级用户
★★
论坛灌水专业户
积分 613
发帖 266
注册 2006-04-19 22:47
UID 54113
来自 河南省
状态 离线
呵呵看了半天,就是不懂!~~
饮马恒河畔,剑指天山西,碎叶城揽月,库叶岛赏雪,黑海之滨垂钓,贝尔加湖面张弓;中南半岛访古,东京废墟祭祖!
18 发表于 2006-05-12 13:17 ·  中国 甘肃 兰州 中移铁通
初级用户
积分 90
发帖 38
注册 2006-01-06 18:41
UID 48522
状态 离线
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 发表于 2006-05-13 18:49 ·  中国 山西 临汾 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re arding:

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


我在13楼中猜测,cmd将其修改前的句柄存放在“从未访问过的未定义句柄中(3-9)”。这里再明确一下,其中的“从未访问过”,是指在当前的cmd命令行中用户从未显式指定过,而并非cmd本身未使用过,而“从未访问过”的句柄可能有多个,而cmd会选择第一个。如果你有反面的例证,不妨提出。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
20 发表于 2006-05-14 17:15 ·  中国 山西 临汾 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
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的则是用水泵将水扬空。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
21 发表于 2006-05-15 11:38 ·  中国 甘肃 兰州 中移铁通
初级用户
积分 90
发帖 38
注册 2006-01-06 18:41
UID 48522
状态 离线
Re Willsort:
通过反复试验,可以猜测系统的句柄使用策略,比如
cnd 2>nul 3>nul 对输出的改变,能够用cnd 2>&3 4>&3恢复回来。
一句中的 4 便是猜测的结果,这也是基于刚刚进入cmd,句柄的使用情况比较清楚地情况下的猜测。
如果在一个批处理中反复使用了句柄重定向,则难以判断其句柄空间的情况,所以我说“系统决定,用户难以左右”。
我同意你的关于“未用句柄”的概念,测试也证实了这个概念。实际上,我感觉到明确的概念至关重要,反之则贻害无穷。就像windows帮助那些似是而非的说明,只会使人更加糊涂。
22 发表于 2006-10-12 08:00 ·  中国 浙江 衢州 电信
银牌会员
★★★
积分 1,270
发帖 548
注册 2004-05-31 00:00
UID 25754
性别 男
状态 离线
顶上去。
23 发表于 2006-10-12 09:47 ·  中国 湖南 娄底 新化县 电信
银牌会员
★★★
积分 1,218
发帖 485
注册 2006-07-21 21:24
UID 58987
来自 湖南.娄底
状态 离线
经典, 又扩展思路了, 句柄重定向!
24 发表于 2006-10-12 10:15 ·  中国 浙江 温州 电信
初级用户
积分 30
发帖 15
注册 2005-08-13 01:44
UID 41606
性别 男
状态 离线
看不懂啊~ 努力ing......
25 发表于 2006-10-12 11:41 ·  中国 重庆 璧山区 电信
中级用户
★★
积分 235
发帖 109
注册 2006-08-24 00:52
UID 61161
性别 男
状态 离线
爱我还看不懂
26 发表于 2006-10-12 13:34 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线

两位实在是令人敬佩,但最终给人的感觉,还是没有明确说明句柄重定向的原理,尽管举了几个例子。
27 发表于 2006-10-12 21:55 ·  中国 四川 成都 教育网
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
UID 42173
性别 男
状态 离线
知道有这回事就行啦。不懂的看Linux Shell入门

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
28 发表于 2006-10-14 03:41 ·  泰国 曼谷 True
新手上路
积分 8
发帖 2
注册 2006-04-24 12:01
UID 54368
性别 男
状态 离线
看了这篇文章大长见识,不过还希能有高手来指点大家,顶一下
29 发表于 2007-03-17 20:29 ·  中国 上海 黄浦区 电信
初级用户
积分 49
发帖 22
注册 2005-08-04 13:44
UID 41332
性别 男
状态 离线
深奥,理解中
30 发表于 2007-03-18 01:43 ·  中国 广东 广州 电信
中级用户
★★
脚本爱好者
积分 238
发帖 93
注册 2007-03-11 13:38
UID 81417
性别 男
来自 GZ
状态 离线
哗!这些学识是从哪里学的呢,高深到极!
论坛跳转: