Windowscmd命令⾏输⼊输出重定向问题
最近学校的⽹⽐较搓,DNS天天挂,出⼝带宽天天堵,NAT后的总出⼝带宽也才4MB/s(来源:360测速),唉,不亲⾝体会⿁才知道⼀堆⼈共享这个带宽是什么感觉。
废话不多说了,在Unix下重定向⽤着感觉很high,现在想把win下的nslookup的错误提⽰“*** Can't find rver name for address 10.3.9.5: Non-existent domain”⼀同导出到txt⽂件,搜了下,嗯,遂有此⽂。
再说句废话,windows这是⾚裸裸的抄袭啊,stdio(0),stdout(1),stderr(2)都跟unix是⼀样的
重定向符号主要有:>,>>,<,>&,<&和|,以下只有前五个的介绍,最后⼀个是管道,与Unix亦完全⼀致。
第⼀节
⾸先从⼀个经典问题开始,“1>nul 2>nul”的意思是既屏蔽正常的输出⼜屏蔽错误的输出,那么我们马上就知道了这⾥的1表⽰正常输出(即所谓的“标准输出”--stdout),2表⽰错误输出(即所谓的“标准错误输出”--stderr)。
1和2其实是句柄stdout和stderr的数字代号,⾄于什么是句柄,我认为可以理解为某种事物的⼀种标识,
或者说这个句柄指向某个事物。举个例⼦来说,“标准输出”以句柄stdout为标识,或者说句柄stdout指向“标准输出”。
还有⼀个句柄--stdin,它是所谓“标准输⼊”的标识,数字代号是0。除此之外还有3~9可⽤,只是它们没有定义。
“标准输出”和“标准错误输出”默认是要输出到控制台con(即cmd窗⼝)的,⽽“标准输⼊”默认是由控制台con(即键盘)输⼊的,因此重定向的⽬的就是将输⼊输出流从默认位置重定向到新的位置。符号“>”和“>>”的默认句柄代号是1,⽽“<”的默认句柄代号是0。
“echo hhhhhh”类似于这样的语句可以说是我们再熟悉不过的了,但这只是种默认的状态,其实⾥⾯还有⼀些内容。这⼀句完整的应该是这样的:“echo hhhhhh 1>con 2>con”,意思是将echo命令的结果中的标准输出和标准错误输出输出到控制台con 中,只不过此时标准错误输出是空的。
再看⼀个例⼦,如果给dir⼀个错误的参数,例如“dir /mm”,那么写全了就是“dir /mm 1>con 2>con”,只不过此时的标准输出是空的。如果你这样写的话“dir /mm 1&”,那么屏幕上会照常显⽰错误信息但中不会有内容。
再来⼀个标准输⼊的例⼦,“t /p var= ”其实应该是这样的“t /p var= 0<con”,只是因为0<con是默认值可以省略。我们当然可以从⽂件中读取输⼊,如“t /p var= 0&”,0是默认值可以省略。
nul代表的是“空设备”,是⼀个不存在的设备,将输出流重定向到空设备就相当于屏蔽掉了⼀样。⽽如果从空设备中读取输⼊,⾃然是读不到东西的,但的确是输⼊了,这也就是“t /p var=<nul”中“<nul”相当于回车但不换⾏的原因。
第⼆节
下⾯要讲的是句柄代码之间的“重定向”。之前不是提到过还有3~9这7个句柄数字代号吗,这些究竟有什么⽤?说实话,基本没什么⽤,因此建议你如果不是迫切想知道这部分内容的话就不要往下看了。
“echo hero 1&”这⼀句是将标准输出重定向到⽂件,相当于将句柄代号1的指向由con变为。“echo hero 3& 1<&3”,这句的结果是⽣成了⽂件,其内容为hero,过程是这样的:“3&”是将句柄数字代号 3的指向由“空”变为;“1<&3”是将句柄数字代号3的指向复制给1的指向,此时1的指向就为了,因此标准输出就被重定向到中了。怦然心动 美国电影
“i<&j”和“i>&j”的效果都是把j的指向复制给i。“echo hero & 2>&1”这句的意思是,⽆论是标准输出还是标准错误输出都会被重定向到中,具体过程:1的指向由con转为 ,“2>&1”是把1的指向复制给2,此时2的指向也变为了,因此1和2都会被重定向到 中。注意:1是符号“>”的默认句柄数字代号。
再看“echo hero 3&”,这个为什么就不能将结果重定向到⽂件中呢?记住,我们要重定向的只有标准输⼊、标准输出和标准错误输出,因此真正“⼲活” 的就只有0、1和2,因为它们分别指代了前⾯的三者,⽽3没有指代任何句柄只能作为间接量使⽤。
“more 3& 0>&3”这句是显⽰⽂件,具体过程:“3&”把3的指向变为 ,“0>&3”把3的指向复制给0,即0指向了(只不过这次是从中读取数据)。强调⼀下,真正能读取数据的是0⽽不是3,3只是作为中间量⽽已。刚才这句我们当然可以这么写:“more 0&”或直接“more &”。
再来⼀个例⼦“echo hero 5& 4>&5 3<&4 1<&3”,结果输出到了中。具体过程:5的指向变成,“4>&5”把5的指向复制给 4,“3>&4”把4的指向复制给3,“1>&3”把3的指向复制给1,最终1的指向就是,则1所指代的标准输出就被重定向到了。
第三节
注意:这⼀节的内容都是围绕着下⾯这个例⼦进⾏叙述的。
代码:iframe
@echo off
oha
echo 英雄是好男⼈
echo 1>nul 3>nul
echo 英雄是
echo 英雄是
echo 这是怎么回事,难道就不能 1>con 4>con
pau
这究竟是怎么回事?为什么结果会如此出乎意料?
这⾥涉及到⼀个所谓“备份”的问题,就是在修改某个句柄代号的指向之前,系统会把该句柄代号原来的指向备份到截⽌到⽬前第⼀个指向为空的句柄代号中。⽬的是当这⼀⾏的程序结束之后,系统可以通过备份找回原来的指向。
( 在继续阅读之前建议你准备好纸笔,以便能记录下各个代号指向的变化,这样不⾄于混乱)
我们现在把焦点集中到这句“echo. 1>nul 3>nul”上来。这句究竟是如何⼯作的呢?
第⼀步:在运⾏“1>nul”之前,1的指向是默认值con,此时代号3~9的指向都是空(初始值),因此系统会把1的指向备份到
3(因为3是第⼀个为空的代号),3就指向了con。就是说系统把1原来的指向复制给了3,⽬的是语句结束后能找回原来的指向,这就相当于备份。
第⼆步:现在3的指向是con。然⽽由于要运⾏“3>nul”,因此还要备份3的指向。此时4是空的,系统就把3的指向con复制给了4,即4现在指向con。就是说3以4为备份。
第三步:由于“3>nul”使得3指向了nul。
scientist是什么意思第四步:这⾏语句结束时,1要找回原来的指向,从以上叙述我们知道,3是1的备份,因此1要通过3来恢复“原来”的指向,但此时3的指向已经变为了nul,故1就指向nul。
第五步:⽽3要恢复原来的指向就要找4,4指向con,故3恢复为con;4原始指向是空的,其备份在5中,故4的指向恢复到空。
⾄此我们理顺⼀下,现在1指向nul,2指向默认值con,3指向con,4之后都是空指向。那么在运⾏后两句echo语句时由于1指向nul,即标准输出被重定向到空设备,故显⽰被屏蔽。
诗史数千言再来看看这句 “echo 这是怎么回事,难道就不能 1>con 4>con” 这句是怎么⼯作的呢?
第⼀步:1当前指向是nul,由于要运⾏“1>con”,因此要进⾏备份。但此时3指向的是con⾮空,故系统将1的指向备份到4,即4指向nul。
第⼆步:⼜由于要运⾏“4>con”,故4现在的指向nul就⼜被备份到5中,5以后的事姑且省略。
第三步:运⾏完“4>con”之后4就指向con。
第四步:该⾏程序结束后,1要通过4来恢复指向。4指向con,故1指向con从⽽恢复了默认状态。⽽4找5,5指向nul,故4指向nul。
我们再数⼀数现在的情况,0指向con,1指向con,2指向con,3没动还是指向con,4指向nul,5以后都为空指向。
会不会有点乱?那就再好好的看⼏遍吧,或者是看看这篇,讲的更基础⼀些:
第四节
我们已经知道“echo hero”相当于“echo hero 1>con 2>con”,con表⽰控制台,可以把con看做是特殊的⽂件,这就是我们⽆法建⽴名为con⽂件的原因。
再对“>”和“>>”的重定向机制做个分析。当要重定向到的⽂件有隐藏或系统属性时,“>>”可以正常运⾏,⽽ “>”就⽆法操作了。据此我推测,对于“>”的重定向输出,如果⽂件不存在当然是建⽴⽂件,⽽如果⽂件存在就先将⽂件删除,然后再新建⽂件,也就是说并⾮是覆盖⽂件的内容⽽是先删除⽂件再建⽴新⽂件。
通过第三节的讲解你应该明⽩为什么类似这样的语句“echo hero >nul >con & >con”会以最后⼀个为准了吧。
最后需要注意⼀点的是--重定向输出⽆法输出到只读⽂件。
完。
WIN下的⼤部分重定向与Unix还是⼀致的,嗯
下⾯是补充
Windows下cmd标准输⼊输出重定向
Command功能
command > filename把标准输出重定向到⼀个⽂件中
公共事业管理英文
冰血暴第二季
Command功能
command >> filename把标准输出重定向到⼀个⽂件中(追加)
command 1 > fielname把标准输出重定向到⼀个⽂件中
command > filename 2>&1把标准输出和标准错误⼀起重定向到⼀个⽂件
command 2 > filename把标准错误重定向到⼀个⽂件中
command 2 >> filename把标准错误重定向到⼀个⽂件中(追加)
lindsay
quartcommand >> filename 2>&1把标准输出和标准错误⼀起重定向到⼀个⽂件中(追加)
command < filename1 > filename2command命令以filename1⽂件作为标准输⼊,以filename2⽂件作为标准输出command < filename command命令以filename⽂件作为标准输⼊
command << delimiter从标准输⼊中读⼊,直⾄遇到delimiter分界符
command < &m将⽂件描述符m作为标准输⼊
command > &m将标准输出重定向到⽂件描述符m中
command < &-关闭标准输⼊
以上就是Windows cmd命令⾏输⼊输出重定向问题的详细内容,更多关于cmd命令⾏输⼊输出重定向的资料请关注其它相关⽂章!
>duckload