关于cmd命令的重定向输出 2>&1
mycommand >mylog.txt 2>&1 应该是最经典的用法了。
命令的结果可以通过“%>”的形式来定向输出,%表示文件描述符:1为标准输出stdout、2为标准错误stderr。系统默认%值是1,也就是“1>”,而1>可以简写为>,也就是默认为>。stdout的默认目标是终端,stderr的默认目标为也是终端。我们在批处理中执行: echo text >result.txt ,我们就可以在屏幕上会看到 echo text 1>result.txt ,即是这个道理。
其中&需要直接与重定向符号结合使用。
应用实例:
1、将结果输出到result.txt
net stop myservices >>result 2>&1
2、隐藏程序输出结果
net stop myservices >nul 2>nul
微软关于重定向的文章:使用命令重定向操作符
可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到其他位置。输入或输出数据流的位置称为句柄。
下表将列出可用的句柄。
句柄 句柄的数字代号 描述
STDIN
0
键盘输入
STDOUT
1
输出到命令提示符窗口
STDERR
2
错误输出到命令提示符窗口
UNDEFINED
3-9
句柄由应用程序单独定义,它们是各个工具特有的
数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序,并对该程序前 10 个句柄中的任何一个句柄进行重定向。要指定要用的句柄,请在重定向操作符之前键入该句柄的数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 < 或 > 操作符之后,必须指定数据的读写位置。可以指定文件名或其他现有的句柄。
要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号(即 &句柄号)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):
2>&1
下表列出了可用于重定向输入和输出数据流的操作符。
重定向操作符 描述
>
将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄。
<
从文件而不是从键盘或句柄读入命令输入。
>>
将命令输出添加到文件末尾而不删除文件中已有的信息。
>&
将一个句柄的输出写入到另一个句柄的输入中。
<&
从一个句柄读取输入并将其写入到另一个句柄输出中。
|
从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。
默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。
重定向输入 (<)
要通过键盘将输入重定向到文件或设备,请使用 < 操作符。例如,要从 File.txt 获取 sort 命令的输入,请键入:
sort<file.txt
File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。
< 操作符可以打开具有只读访问权限的指定文件名。因此,不能在使用该操作符时向文件中写入信息。例如,如果以 <&2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句柄 2 最初是以只写访问方式打开的。
注意
0 是 < 重定向输入操作符的默认句柄。
重定向输出 (>)
几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的命令也会在命令提示符窗口显示消息和提示。
要将输出从命令提示符窗口重定向到文件或设备,请使用 > 操作符。可以在许多命令中使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入:
dir>dirlist.txt
如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。
要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,请键入:
netsh routing dump>c:\route.cfg
> 操作符可以打开具有只写访问权限的指定文件。因此,不能使用该操作符读取文件。例如,如果使用重定向操作符 >&0 启动程序,则写入句柄 1 的所有尝试操作都将失败,因为句柄 0 最初是以只读访问方式打开的。
注意
1 是 > 重定向输出操作符的默认句柄。
复制句柄
重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如,要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入:
dir>c:\file.txt 2>&1
复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只读访问的属性,则该句柄的所有副本都具有只读访问属性。不能将一个具有只读访问属性的句柄复制到另一个具有只写访问属性的句柄。
使用 & 操作符重定向输入和副本
要将重定向输入操作符 (<) 与复制操作符 (&) 结合使用,指定的文件必须已经存在。如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件包含的字符作为输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄复制到系统现有的句柄中。
例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入:
<file.txt
要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入:
sort<file.txt
要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,请键入:
findfile file.txt>search.txt 2<&1
要以句柄 0 输入读取(即 STDIN)的方式复制用户定义的句柄 3,请键入:
<&3
使用 & 操作符重定向输出和复制
如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。
要将用户定义的句柄 3 复制到句柄 1,请键入:
>&3
要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入:
ipconfig.exe>>output.log 2>&1
使用 >> 重定向操作符附加输出
要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 >>)。例如,使用下列命令可以将 dir 命令生成的目录列表附加到 Dirlist.txt 文件:
dir>>dirlist.txt
要将 netstat 命令的输出附加到 Tcpinfo.txt 的末尾,请键入:
netstat>>tcpinfo.txt
使用管道操作符 (|)
管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其定向到另一个命令的输入(默认情况下是 STDIN)中。例如,使用下面的命令可以对目录进行分类:
dir | sort
在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到句柄 1(即 STDOUT)。
合并带重定向操作符的命令
通过合并带有其他命令和文件名的筛选器命令,可以创建自定义命令。例如,可以使用以下命令存储包含“LOG”字符串的文件名:
dir /b | find "log" loglist.txt
dir 命令的输出是通过 find 筛选器命令进行发送的。包含字符串“LOG”的文件名作为文件名列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件 Loglist.txt 中。
要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将搜索 C 盘上的每个目录以查找包含“LOG”字符串的文件名,并且在命令提示符窗口中每次显示一屏:
dir c:\ /s /b | find "log" | more
利用管道 (|) 可以对 Cmd.exe 进行定向,使其通过 find 筛选器命令发送 dir 命令输出。find 命令只选择包含字符串“LOG”的文件名。more 命令可以显示 find 命令选择的文件名(在命令提示符窗口中每次显示一屏)。
+++++++++++++++++++
Windows命令之 -- 使用命令重定向操作符
下表将列出可用的句柄。
句柄 句柄的数字代号 描述
STDIN 0 键盘输入
STDOUT 1 输出到命令提示符窗口
STDERR 2 错误输出到命令提示符窗口
UNDEFINED 3-9 这些句柄由应用程序单独定义,并且是各个工具特定的。
数字 0 到 9 代表前 10 个句柄。
可以使用命令 Cmd.exe 运行程序并将该程序前 10 个句柄中的任何一个重定向。要指定想使用的句柄,可在重定向操作符前面键入该句柄的数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 > 或 < 操作符之后,必须指定要读取或写入数据的位置。可以指定文件名或另一个现有的句柄。
要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号(例如 &句柄#)。例如,下面的命令可以 将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):
2>&1
下表列出了可用于将输入和输出数据流进行重定向的操作符。
重定向操作符 描述
> 将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口或句柄中。
< 从文件中而不是从键盘或句柄中读入命令输入。
>> 将命令输出添加到文件末尾而不删除文件中的信息。
>& 将一个句柄的输出写入到另一个句柄的输入中。
<& 从一个句柄读取输入并将其写入到另一个句柄输出中。
| 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。
默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。
重定向输入 (<)
要将键盘输入重定向到文件或设备,请使用 < 操作符。例如,要从 File.txt 获取 sort 命令的输入,请键入:
sort<file.txt
File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。
< 操作符可以打开具有只读访问的指定文件名。所以,不能使用该操作符向文件中写入信息。例如,如果以 <&2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句柄 2 最初是以只写访问打开的。
注意
0 是 < 重定向输入操作符的默认句柄。
重定向输出 (>)
几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的命令也会在命令提示符窗口显示消息和提示。
要将输出从命令提示符窗口重定向到文件或设备,请使用 > 操作符。可以在许多命令中使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入:
dir>dirlist.txt
如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。
要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,请键入:
netsh routing dump>c:\route.cfg
> 操作符可以打开具有只写访问属性的指定文件。所以,不能使用该操作符读取文件。例如,如果使用重定向 >&0 启动程序,则所有试图写入句柄 1 的操作都将失败,因为句柄 0 最初是以只读访问打开的。
注意
1 是 > 重定向输出操作符的默认句柄。
复制句柄
重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如,要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入:
dir>c:\file.txt 2>&1
复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只写访问的属性,则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄复制到另一个具有只写访问属性的句柄。
使用 & 操作符重定向输入和副本
要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用,指定的文件必须已经存在。如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中包含的字符作为输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄复制到系统现有的句柄中。
例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入:
<file.txt
要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入:
sort<file.txt
要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,请键入:
findfile file.txt>search.txt 2<&1
要以句柄 0 输入读取(即 STDIN)的方式复制用户定义句柄 3,请键入:
<&3
使用 & 操作符重定向输出和复制
如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。
要将用户定义句柄 3 复制到句柄 1,请键入:
>&3
要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入:
ipconfig.exe>>output.log 2>&1
使用 >> 重定向操作符追加输出
要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 >>)。例如,下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件:
dir>>dirlist.txt
要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾,请键入:
netstat>>tcpinfo.txt
使用管道操作符 (|)
管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另一个命令的输入中(默认情况下是 STDIN)。例如,下面的命令将对目录分类:
dir | sort
在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到句柄 1(即 STDOUT)。
合并带重定向操作符的命令
可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如,可以使用以下命令存储包含“LOG”字符串的文件名:
dir /b | find "LOG" > loglist.txt
dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件 Loglist.txt 中。
要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名,并且在命令提示符窗口中每次显示一屏:
dir c:\ /s /b | find "LOG" | more
利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅使用筛选器。
文转自http://hi.baidu.com/%B0%D9%B6%C8hihi/blog/item/ec2ef41bad621ef8ae51335c%2Ehtml
这是我学习之中知道的一些关于重定向和管道的知识,并积累的资料,在这里和大家分享。如果说的有不足和错误的地方,请指出。毕竟是交流信息。我这里是从DOS和C语言方面看它,没有太多涉及LINUX中所说的。我想从以下几个方面叙述:
一、 重定向:
所谓重定向,就是不使用系统的标准输入端口、标准输出端口或标准错误端口,而进行重新的指定,所以重定向分为输出重定向、输入重定向和错误重定向(注:
STDIN 0 标准输入 键盘 命令在执行时所要的输入数据通过它来取得
STDOUT 1 标准输出 显示器 命令执行后的输出结果从该端口送出
STDERR 2 标准错误 显示器 命令执行时的错误信息通过该端口送出 )。
通常情况下重定向到一个文件。重定向命令又称转向命令。其中错误重定向和输出重定向有些类似,就不多说,学过C++可能会明白的多些。
所 谓输出重定向指把执行相应DOS命令时本应在屏幕上显示的内容输出到重定向命令所指向的文件或设备中去。输出重定向命令 > 、>>。它们的区别是:如果你使用的是 > ,原文件会被删除,重新生成新的文件,其内容如上所述;如果你使用的是 >> ,它以追加的方式,将命令的输出写入文件的末尾,原文件内容会被保留,新的内容会添加到原文件件的内容的后面。主要用在某个命令的输出很多,在屏幕上不能 完全显示,就可把它重定向到一个文件中,稍后再用文本编辑器来打开这个文件。
输入重定向使输入信息来自文件。如果一个名为file.com的文件 C:>file 之后,执行file时所需的处理信息就改为由文件file读入,这就是输入重定向。小于号<是输入重定向操作符,在<之后的文件名或设备名是 重定向的输入源。如果一个程序时需要输入较多数据,使用输入重定向可以提高效率。在这里要说一些过滤命令 more 、sort 和 find 。其中more进行分屏显示;find 查找符合条件的内容;sort(按行)排序。
例如:(我是在windows命令提示符中用的)
例1:
more < f:\turboc2\readme
more的输入来自 c:\tc\readme 文件内容多。这个命令与
type f:\turboc2\readme | more
作用相同,但更简洁,效率也更高。
例2:(注cmd重定向进入后用exit返回原目录)
cmd > file 把 stdout 重定向到 file 文件中
cmd >> file 把 stdout 重定向到 file 文件中(追加)
cmd 1> file 把 stdout 重定向到 file 文件中
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中
cmd 2> file 把 stderr 重定向到 file 文件中
cmd 2>> file 把 stderr 重定向到 file 文件中(追加)
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中
cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout
注:>&n 使用系统复制文件描述符 n 并把结果用作标准输出
<&n 标准输入复制自文件描述符 n
<&- 关闭标准输入(键盘)
>&- 关闭标准输出
n<&- 表示将 n 号输入关闭
n>&- 表示将 n 号输出关闭
&> 同时实现输出重定向和错误重定向
用 途:DOS的标准输入输出通常是在标准设备键盘和显示器上进行的, 利用重定向,可以方便地将输入输出改向磁盘文件或其它设备。如在批处理命令执行期间为了禁止命令或程序执行后输出信息而扰乱屏幕, 可用DOS重定向功能把输出改向NUL设备(NUL不指向任何实际设备): C:\>copy a.txt b.txt > NUL。命令执行结束不显示"1 file(s) copied"的信息。有的交互程序在执行时要求很多键盘输入, 但有时输入是固定不变的, 为加快运行速度, 可预先建立一个输入文件,此文件的内容为程序的键盘输入项, 每个输入项占一行。假如有一个程序cx 其输入项全部包括在文件in.dat中, 执行 C:\>cx <in.dat>NUL 程序就自动执行。
二、 管道:
进 程从“管道”的一端发送另一端接收,也就是说将若干命令用输入输出“管道”串接在一起,这就是管道;管道在某种程度上是输入和输出重定向的结合,前一个命 令的输出,作为下一个命令的输入,而不需要经过任何中间文件。竖线字符“|”是管道操作符,管道命令经常与上面讲的过滤命令联合使用。DOS的管道功能是 使一个程序或命令的标准输出用做另一个程序或命令的标准输入。如把DEBUG的输入命令写入文件aaa, 用type命令通过管道功能将aaa的内容传输给DEBUG, 在DEBUG执行期间不再从控制台索取命令参数, 从而提高了机器效率。命令为: C:\>type aaa|DEBUG >bbb。
例如,这是我以前看到的例子。命令dir|more使得当前目录列表在屏幕上逐屏 显示。dir的输出是整个目录列表,它不出现在屏幕上而是由于符号“|”的规定,成为下一个命令more的输入,more命令则将其输入,more命令则 将其输入一屏一屏地显示,成为命令行的输出。再如命令dir|find”hello”>file,其中 dir的输出是当前目录列表,不出现在屏幕上而是成为find命令的输入。find命令在输入文件中寻找指定字符串"hello"并输出包含这个字符串的 行,由于输出重定向符号>的规定,最后的输出已存入文件file,不出现在屏幕上。命令dir|find"< dir >file则是将当前目录项中的子目录项寻找出来并存入文件file中。