大家先猜猜运行下面这段代码会出现什么样的结果,然后我们再来谈谈为什么会出现这种结果。- @echo off 2>&3 3>nul&@1>&4 4>nul
- echo 表演开始罗 :>con
- echo 看见我了吗?
- set /a a=1/0
- ping /n 1 1.1.1.1.1.1
- -&abcdefgh
- cd /d abc:\def
- echo %123%
- echo bathome>con 5>con
- echo 句柄真神奇!
- pause>nul
复制代码 运行的结果是不是出人意料,在“echo 表演开始罗 :>con”“和echo bathome>con 5>con”之间大家熟知的各种信息包括错误信息全部石沉大海不见踪迹,而屏幕上仅仅显示了“表演开始罗 :”“bathome”“句柄真神奇”这三句信息。那么这究竟是怎么回事呢?这代码中的1 2 3 4 5又是什么东西呢?咱们往下走。。。
相信看过了论坛关于句柄重定向等贴子的会员都知道1 2 3 4 5这5个数字在代码中都是代表着句柄,而con是指标准输出或输入设备(在这里理解为屏幕)。关于句柄备份和重定向,论坛虽已经有专贴对其进行了详细的说明。但由于句柄这个东东确实难,老鸟理解起来都感觉吃力,更别说什么新人了。因此本人以自己的方法,结合以上的代码再对句柄及其作用进行一次描述说明。
首先,我们要知道句柄有10兄弟(0-9),其中0 1 2三个人是有工作的,而且都是干公务员的(为什么这么说下面自有理论哈)。而3-9几位平常都是无业游民,出入于杂铺流留于市井。“我靠!你小子竟敢数落洒家,看打。。。”9的气已不打一处而来,顺手抄起一西瓜皮就甩将过来。。。我躲!还好老子还练过。大家看到了不,我没说错吧,他们平常就是氓流哈。“嗖。。。”8的鞋也飞过来了,我再躲。。。好了,咱就先别惹这几个家伙了(很明显3 4 5 6 7也纷纷抄鞋怒视于我)。我们先来讲讲身为公务员的0 1 2三号兄弟吧。0从事的职业跟大家是最密切同时也是最为大家所忽视的。大家都是用键盘进行输入的吧,0默认接收键盘(con)的输入到屏幕(至于包不包括语音输入和手写输入我就不知道了,汗水!)。大家在cmd上键入“copy con>a.txt”,然后下面输入的每一个字符(包括回车换行符)都会重定向输出到a.txt中,直到你用ctrl+c结束命令(大家利用这点可以直接在cmd上生成bat哦)。此时0的工作就由0和>共同承担了(既输出到屏幕又输出到a.txt。“当然了,老子一个做不会闷死啊,我也得拖个下水是不?”0看来很得意很公务员。。。那么1和2他们又是从事什么工作的呢?1分管的是将程序运行的正确信息输出(标准输出),而2分管的是将程序运行中的错误信息进行输出(标准输出)。我们平常所常见的1>nul 2>nul,实际上就是把所在行所有的标准输出都屏蔽掉。其实1和2也很公务员,他们有时也并不是那么敬业,会将自己的工作丢给3或4或5或。。。如上面的代码所示,2想“偷得浮生半日闲”,便通过大叔(>重定向符)将自己的工作交给下一个兄弟3,当然3也不是省油的灯,还想着如何跟2哥理论理论。。。“你想偷懒,没门,给我好好工作!”2早就看出了3的心思并以兄长的口吻教训了3,3只得将2剩下的工作老老实实接了下来,但他却很有本事,将错误输出通过大叔(>)一股脑一次重定向到nul(nul是指空设备,大家就理解为cmd中的黑洞了),大家注意到这个重定向是第一行中一次完成,不得不说3确实厉害(其实3-9都有这本事)。这时1觉得不公平了,为什么我不学学2呢?接着他又重复了2的操作,可是3没办法接替两位兄长的工作啊,于是1看到了老实的4(也只能是4因为3后面是4)。。。“小4过来,哥有事找你。”“哥有啥事啊?”小4哪敢怠慢,马上跑将过来。“是这样,哥有事要出去下,你就先帮我完成下工作吧。”1说完便也没管4愿与不愿,径自出得门庭找9去了。没办法,兄命如父命啊,小4只好将1的工作全接了下来,他也学3将正确输出通过大叔(>)一股脑一次重定向到nul(这小子太没头脑了,身为长辈的>在心中暗暗骂到)。的确,3是将错误信息丢给了黑洞nul,4你怎么将正常的显示信息也丢给了黑洞。这时他们的大叔>看不下去了,于是再次出马将第二行的信息重定向到了con(屏幕)。但是大叔也很忙,他做完了一行的工作就去打牌了(原来是这样忙的。。。)。于是,后面所有的信息无论错误还是正确,都被3和4丢入了黑洞(nul)之中。。。
这时,早有人去cmd那里告状了,cmd马上找到了打牌的>和5(只能是5因为4后面是5。。。),通过他们的共同努力终于恢复了正常的输出。。。如果大家还没看明白,就再去读读论坛其他关于句柄备份的贴子吧。
ps:实际上@echo off 2>&3 3>nul&@1>&4 4>nul可以写成@echo off 2>nul 3>nul&@1>nul 4>nul也是一样的。
它也相当于vbs中的on errer resume next(忽略一切错误),不知道说对了不。。。 |