Windows cmd命令行输入输出重定向问题

最近学校的网比较搓,DNS天天挂,出口带宽天天堵,NAT后的总出口带宽也才4MB/s(来源:360测速),唉,不亲身体会鬼才知道一堆人共享这个带宽是什么感觉。
废话不多说了,在Unix下重定向用着感觉很high,现在想把win下的nslookup的错误提示“*** Can't find server 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>hero.txt”,那么屏幕上会照常显示错误信息但hero.txt中不会有内容。

再来一个标准输入的例子,“set /p var= ”其实应该是这样的“set /p var= 0<con”,只是因为0<con是默认值可以省略。我们当然可以从文件中读取输入,如“set /p var= 0<file.txt”,0是默认值可以省略。

nul代表的是“空设备”,是一个不存在的设备,将输出流重定向到空设备就相当于屏蔽掉了一样。而如果从空设备中读取输入,自然是读不到东西的,但的确是输入了,这也就是“set /p var=<nul”中“<nul”相当于回车但不换行的原因。

第二节

下面要讲的是句柄代码之间的“重定向”。 之前不是提到过还有3~9这7个句柄数字代号吗,这些究竟有什么用?说实话,基本没什么用,因此建议你如果不是迫切想知道这部分内容的话就不要往下看了。

“echo hero 1>hero.txt”这一句是将标准输出重定向到文件hero.txt,相当于将句柄代号1的指向由con变为hero.txt。“echo hero 3>hero.txt 1<&3”,这句的结果是生成了文件hero.txt,其内容为hero,过程是这样的:“3>hero.txt”是将句柄数字代号 3的指向由“空”变为hero.txt;“1<&3”是将句柄数字代号3的指向复制给1的指向,此时1的指向就为hero.txt了,因此标准输出就被重定向到hero.txt中了。

“i<&j”和“i>&j”的效果都是把j的指向复制给i。“echo hero >hero.txt 2>&1”这句的意思是,无论是标准输出还是标准错误输出都会被重定向到hero.txt中,具体过程:1的指向由con转为 hero.txt,“2>&1”是把1的指向复制给2,此时2的指向也变为了hero.txt,因此1和2都会被重定向到hero.txt 中。注意:1是符号“>”的默认句柄数字代号。

再看“echo hero 3>hero.txt”,这个为什么就不能将结果重定向到文件中呢?记住,我们要重定向的只有标准输入、标准输出和标准错误输出,因此真正“干活” 的就只有0、1和2,因为它们分别指代了前面的三者,而3没有指代任何句柄只能作为间接量使用。

“more 3<hero.txt 0>&3”这句是显示文件hero.txt,具体过程:“3<hero.txt”把3的指向变为 hero.txt,“0>&3”把3的指向复制给0,即0指向了hero.txt(只不过这次是从hero.txt中读取数据)。强调一下,真正能读取数据的是0而不是3,3只是作为中间量而已。刚才这句我们当然可以这么写:“more 0<hero.txt”或直接“more <hero.txt”。

再来一个例子“echo hero 5>hero.txt 4>&5 3<&4 1<&3”,结果输出到了hero.txt中。具体过程:5的指向变成hero.txt,“4>&5”把5的指向复制给 4,“3>&4”把4的指向复制给3,“1>&3”把3的指向复制给1,最终1的指向就是hero.txt,则1所指代的标准输出就被重定向到了hero.txt。

第三节

注意:这一节的内容都是围绕着下面这个例子进行叙述的。

代码:

@echo off
echo 英雄是好男人!!!
echo 1>nul 3>nul
echo 英雄是
echo 英雄是
echo 这是怎么回事,难道就不能 1>con 4>con
pause

这究竟是怎么回事?为什么结果会如此出乎意料?
这里涉及到一个所谓“备份”的问题,就是在修改某个句柄代号的指向之前,系统会把该句柄代号原来的指向备份到截止到目前第一个指向为空的句柄代号中。目的是当这一行的程序结束之后,系统可以通过备份找回原来的指向。

( 在继续阅读之前建议你准备好纸笔,以便能记录下各个代号指向的变化,这样不至于混乱)
我们现在把焦点集中到这句“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。

第四步:这行语句结束时,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 >hero.txt >con”会以最后一个为准了吧。

最后需要注意一点的是--重定向输出无法输出到只读文件。

完。
WIN下的大部分重定向与Unix还是一致的,嗯

下面是补充

Windows下cmd标准输入输出重定向

Command 功能
command > filename 把标准输出重定向到一个文件中
command >> filename 把标准输出重定向到一个文件中(追加)
command 1 > fielname 把标准输出重定向到一个文件中
command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件
command 2 > filename 把标准错误重定向到一个文件中
command 2 >> filename 把标准错误重定向到一个文件中(追加)
command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加)
command < filename1 > filename2 command命令以filename1文件作为标准输入,以filename2文件作为标准输出
command < filename command命令以filename文件作为标准输入
command << delimiter 从标准输入中读入,直至遇到delimiter分界符
command < &m 将文件描述符m作为标准输入
command > &m 将标准输出重定向到文件描述符m中
command < &- 关闭标准输入

以上就是Windows cmd命令行输入输出重定向问题的详细内容,更多关于cmd命令行输入输出重定向的资料请关注我们其它相关文章!

(0)

相关推荐

  • dos 内容重定向

    有没有办法把显示在命令行窗口中的帮助信息保存下来呢? 答案是肯定的,并且有不止一种答案. 稍微繁琐一点的办法就是复制命令行窗口中的信息,然后粘贴到文本中保存起来.这个操作比较繁琐的:在命令行窗口点击右键,然后选择"标记",用鼠标拉出复制范围,然后敲回车,最后,粘贴到文本中去. 高效的办法就是:使用重定向符号,把原本输出到cmd窗口中的信息重定向到文本文件中去. 重定向符号有两个:>和>>.它们的作用都是改变各种提示信息的输出方向,把提示信息输出到指定的地方去--各种提

  • dos 内容重定向符 &gt;和&gt;&gt;

    有没有办法把显示在命令行窗口中的帮助信息保存下来呢? 答案是肯定的,并且有不止一种答案. 稍微繁琐一点的办法就是复制命令行窗口中的信息,然后粘贴到文本中保存起来.这个操作比较繁琐的:在命令行窗口点击右键,然后选择"标记",用鼠标拉出复制范围,然后敲回车,最后,粘贴到文本中去. 高效的办法就是:使用重定向符号,把原本输出到cmd窗口中的信息重定向到文本文件中去. 重定向符号有两个:>和>>.它们的作用都是改变各种提示信息的输出方向,把提示信息输出到指定的地方去--各种提

  • DOS的重定向命令使用方法以及在安全方面的应用

    大家知道,DOS下有一个不为大家所常用的命令--重定向命令,这个小东西非常有用,该命令同样可以用于 Win9x/ME/2000/XP下,灵活的使用这个命令可以给我们带来很大的方便--无论是入侵还是防守抑或是系统应用,都会带来很大的便利.今天就让 我们来看几个重定向命令在安全方面的应用实例. 一.命令格式 DOS的标准输入输出通常是在标准设备键盘和显示器上进行的,利用重定向,可以方便地将输入输出改向磁盘文件或其它设备.其中: (1).大于号">"将命令发送到文件或设备,例如打印机&

  • Windows cmd命令行输入输出重定向问题

    最近学校的网比较搓,DNS天天挂,出口带宽天天堵,NAT后的总出口带宽也才4MB/s(来源:360测速),唉,不亲身体会鬼才知道一堆人共享这个带宽是什么感觉. 废话不多说了,在Unix下重定向用着感觉很high,现在想把win下的nslookup的错误提示"*** Can't find server name for address 10.3.9.5: Non-existent domain"一同导出到txt文件,搜了下,嗯,遂有此文. 再说句废话,windows这是赤裸裸的抄袭啊,s

  • Python编程实现控制cmd命令行显示颜色的方法示例

    本文实例讲述了Python编程实现控制cmd命令行显示颜色的方法.分享给大家供大家参考,具体如下: 基于win7 + python3.4 运行效果: import ctypes import sys '''Windows CMD命令行颜色''' # 句柄号 STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE= -11 STD_ERROR_HANDLE = -12 # 前景色 FOREGROUND_BLACK = 0x0 # 黑 FOREGROUND_BLUE = 0

  • Windows使用cmd命令行查看、修改、删除与添加环境变量

    您可以在cmd中使用SET,显示或设置环境变量. 一.查看环境变量 1.查看当前所有可用的环境变量 输入 set 即可查看. 2.查看某个环境变量 输入 “set 变量名”即可.比如想查看path变量的值,即输入 set path 二.修改环境变量 注意:所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改.也就是说当关闭此cmd命令行窗口后,将不再起作用. 永久性修改环境变量的方法有两种:一种是直接修改注册表,另一种是通过我的电脑-〉属性-〉高级,来设置系统的环境变量(查看

  • CMD命令行管道命令使用介绍

    一.什么是管道命令 管道命令能够将一个命令的执行结果经过筛选,只保留我们需要的信息. 如 dir 命令会显示目录下所有文件夹和文件,可以使用管道命令| findstr "" 将dir的结果进行筛选,只保留需要的信息 | 命令管道符 格式:第一条命令 | 第二条命令 [| 第三条命令...] 将第一条命令的结果作为第二条命令的参数来使用,记得在unix 中这种方式很常见. 例如: dir c:\|find "txt" 以上命令是:查找C:\所有,并发现TXT 字符串.

  • Golang执行cmd命令行的方法

    1. Golang执行系统命令使用 os/exec Command方法: func Command(name string, arg ...string) *Cmd 第一个参数是命令名称,后面参数可以有多个命令参数. cmd := exec.Command("ls", "-a") if stdout, err := cmd.StdoutPipe(); err != nil {     //获取输出对象,可以从该对象中读取输出结果     log.Fatal(err)

  • 使用cmd命令行窗口操作SqlServer的方法

    osql 工具是一个 Microsoft Windows 32 命令提示符工具,您可以使用它运行 Transact-SQL 语句和脚本文件.osql 工具使用 ODBC 数据库应用程序编程接口 (API) 与服务器通讯. 本文主要介绍使用windows下的使用cmd命令行窗口操作Sqlserver,首先我们可以运行 osql ?/ ,这样就把所有可以通过CMD命令行操作sqlserver的命令显示出来. osql下载地址 http://www.jb51.net/database/57662.ht

  • 利用WScript.Shell对象隐藏cmd命令行运行框的实现代码

    1. WScript.Shell(Windows Script Host Runtime Library)是一个对象,对应的文件是C:\WINDOWS\system32\wshom.ocx,Wscript.shell是服务器系统会用到的一种组件.shell 就是"壳"的意思,这个对象可以执行操作系统外壳常用的操作,比如运行程序.读写注册表.环境变量等.这个对象通常被用在VB或VBS编程中. 2. 安装WScript.Shell对象:regsvr32 WShom.Ocx 卸载WScrip

  • Windows网络命令行程序参数说明

    Windows网络命令行程序  C:\>nslookup www.jb51.net Server:  www Address:  192.168.5.8 Non-authoritative answer: Name:    www.jb51.net Address:  202.103.69.64 这部分包括:  shi 使用 ipconfig /all 查看配置  使用 ipconfig /renew 刷新配置  对于启用 DHCP 的 Windows 95 和 Windows 98 客户,请使

  • go语言执行windows下命令行的方法

    本文实例讲述了go语言执行windows下命令行的方法.分享给大家供大家参考.具体如下: 在golang里执行windows下的命令行,例如在golang里面调用 del d:\a.txt 命令 复制代码 代码如下: package main import(     "fmt"     "os/exec" ) func main(){       c := exec.Command("cmd", "/C", "del

  • PowerShell入门教程之PowerShell和Cmd命令行的关系?

    PowerShell是命令行的加强版吗?PowerShell能执行命令行的所有命令吗?PowerShell要替代命令行?这三个问题的答案足以让我们了解PowerShell与Cmd命令行之间的关系.让我们慢慢道来... PowerShell中的CMD命令 启动PowerShell,在其中输入几个常用的Cmd命令 复制代码 代码如下: PS D:\Projects\Practise\PowerShell> dir     Directory: D:\Projects\Practise\PowerSh

随机推荐