批处理之命令重定向操作

Posted -飞鹤-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了批处理之命令重定向操作相关的知识,希望对你有一定的参考价值。

1. 介绍

命令重定向操作符 (Redirection Operators)可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到不同的位置。

重定向操作符说明
>将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口中。
<从文件中而不是从键盘中读入命令输入。
>>将命令输出添加到文件末尾而不删除文件中的信息。
>&将一个句柄的输出写入到另一个句柄的输入中。
<&从一个句柄读取输入并将其写入到另一个句柄输出中。
|从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。

默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。输入或输出数据流的位置也被称为句柄。

句柄句柄的数字代号说明
STDIN0键盘输入
STDOUT1输出到命令提示符窗口
STDERR2错误输出到命令提示符窗口
UNDEFINED3-9这些句柄由应用程序和各个具体工具单独定义。

数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将前 10 个句柄中的任何一个重定向到该程序。要指定想使用的句柄,可在重定向操作符前面键入该句柄的数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 > 或 < 操作符之后,必须指定要读取或写入数据的位置。可以指定文件名或另一个现有的句柄.

要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号(例如 &句柄#)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT):

2. 用法

2.1. 重定向命令输出 (>)

几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的命令也会在命令提示符窗口显示消息和提示。要将命令输出从命令提示符窗口重定向到文件或设备,请使用 > 操作符。可以在许多命令中使用该操作符。

rem 将dir输出stdin重定向到文件Dirlist.txt,每次文件都会被重新创建,stdout(1)为默认可省略
dir 1>dirlist.txt
dir>dirlist.txt
rem 将打印信息重定向到文件,每次文件会被重新创建
echo abc>log.txt
rem 将所有的IP信息存入文件
ipconfig>Log.txt
rem 将stderr(2)重定向为到文件
net stop xx 2>res.txt
rem 阻止输出显示,将默认输出位置(句柄)重定向为nul
echo invalie prompt >nul
echo invalie prompt 1>nul

2.2. 重定向命令输入 (<)

要从键盘或设备重定向命令输入,使用 < 操作符。

rem 重定向输入是来自文件,并将输入的文件内容按首字母排序
sort<file.txt 
rem 将从stdin输入重定向为从文件输入,只输入文件首行内容,stdin(0)是默认输入,可以省略
set /p var=0<file.txt
set /p var=<file.txt
echo %var%
rem 将stdin输入重定向为nul,即不接受stdin输入.只显示提示信息,不接受stdin输入,var没有意义可以不用
set /p var=promptString<nul
set /p var=promptString 0<nul
set /p =promptStirng<nul

2.3. 重定向操作符追加输出(>>)

要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 >>)。

rem 将dir输出追加到文件Dirlist.txt中当前内容后面,文件不存在会被创建.stdout(1)为默认可省略
dir 1>>dirlist.txt
dir>>dirlist.txt

2.4. 操作符重定向输出和复制(>&)

如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆盖该文件内容。

rem 将stdout作为的stderr(错误提示)标准输入,相当于将stdou当作tstderr显示
echo promptString 1>&2
rem stdout重定向到文件,stderr(错误提示)也重定向到文件
net stop xx 1>res.txt 2>res.txt
rem stdout重定向到文件,将stderr(错误提示)作为stdout(1)的输入,效果同上,1可省略
net stop xx 1>res.txt 2>&1
net stop xx >res.txt 2>&1

2.5. 操作符重定向输入和复制(<&)

要使用重定向输入操作符 <&,指定的文件必须已经存在。如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中作为输入的字符发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄复制到系统现有的句柄中。

rem 将标准输入(0,键盘输入)当作标准输出的输入,然后将标准输出重定义到文件,以下是等效的
echo 0<&1abcdefg 1>a.txt 
echo abcdefg 1>a.txt
echo abdefg >a.txt
rem 将stderr(2)当作标准输出的输入,然后将标准输出重定义到文件
net stop xx >res.txt 2<&1

2.6. 使用管道操作符 (|)

管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另一个命令的输入中(默认情况下是 STDIN)。

rem 将dir的输出作为sort的输入
dir | sort
rem 查找当前目录中包含".txt"的文件名
dir | find ".txt"
rem 为format命令提供/y参数
echo /y | format a: /s /q /v:system

以上是关于批处理之命令重定向操作的主要内容,如果未能解决你的问题,请参考以下文章

文本三剑客之sed用法详解

Linux高级命令总结

linux命令之Sed

文本处理工具之sed

Linux重定向与管道

文本三剑客之二:sed