重定向符 > 和 >>

在 bat 中,重定向符号(> 和 >>)用于将某条命令的输出写到指定的地方,如写入到文件、nul(空设备)。

>

在批处理中 > 符号实现重定向,可将命令的输出写入到指定的文件、nul(nul 是空设备名,像个黑洞,往往用来屏蔽错误输出等) 等位置。

注意:> 符会覆盖文件中已有的内容。

实例:将 ping 命令的输出信息输出到 ping.txt 文件。如下:

@echo off
ping www.baidu.com > ping.txt
ping www.hxstrive.com > ping.txt
echo finished
pause

运行结果如下:

正在 Ping www.hxstrive.com [120.78.81.7] 具有 32 字节的数据:
来自 120.78.81.7 的回复: 字节=32 时间=42ms TTL=51
来自 120.78.81.7 的回复: 字节=32 时间=42ms TTL=51
来自 120.78.81.7 的回复: 字节=32 时间=42ms TTL=51
来自 120.78.81.7 的回复: 字节=32 时间=42ms TTL=51

120.78.81.7 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 42ms,最长 = 42ms,平均 = 42ms

上面实例中,执行了两条 ping 命令。在 ping.txt 文件中只保存了最后一条 ping 命令的结果,上一次结果被后面的 ping 覆盖了。

>>

>> 符号和 > 符号作用类似,也可将命令的输出写入到指定的文件、nul等。唯一不同的是,>> 符号会将当前命令的结果直接追加到指定文件的最后面。

实例:将 ping 命令的结果写入到 ping.txt 文件。如下:

@echo off
ping www.baidu.com >> ping.txt
ping www.hxstrive.com >> ping.txt
echo finished
pause

运行结果:

正在 Ping www.hxstrive.com [120.78.81.7] 具有 32 字节的数据:
来自 120.78.81.7 的回复: 字节=32 时间=42ms TTL=51
来自 120.78.81.7 的回复: 字节=32 时间=42ms TTL=51
来自 120.78.81.7 的回复: 字节=32 时间=42ms TTL=51
来自 120.78.81.7 的回复: 字节=32 时间=42ms TTL=51

120.78.81.7 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 42ms,最长 = 42ms,平均 = 42ms

正在 Ping www.a.shifen.com [14.215.177.38] 具有 32 字节的数据:
来自 14.215.177.38 的回复: 字节=32 时间=29ms TTL=55
来自 14.215.177.38 的回复: 字节=32 时间=29ms TTL=55
来自 14.215.177.38 的回复: 字节=32 时间=29ms TTL=55
来自 14.215.177.38 的回复: 字节=32 时间=29ms TTL=55

14.215.177.38 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 29ms,最长 = 29ms,平均 = 29ms

正在 Ping www.hxstrive.com [120.78.81.7] 具有 32 字节的数据:
来自 120.78.81.7 的回复: 字节=32 时间=41ms TTL=51
来自 120.78.81.7 的回复: 字节=32 时间=40ms TTL=51
来自 120.78.81.7 的回复: 字节=32 时间=41ms TTL=51
来自 120.78.81.7 的回复: 字节=32 时间=41ms TTL=51

120.78.81.7 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 40ms,最长 = 41ms,平均 = 40ms

上面实例中,执行了两条 ping 命令。在 ping.txt 文件中保存有两条 ping 命令的结果。

屏蔽批处理错误

假如我们需要使用批处理执行 copy 命令拷贝文件到指定目录。如下:

@echo off
copy a.txt bak/b.txt
if %errorlevel%==0 (
    echo SUCCESS
) else (
    echo ERROR
)
pause

运行结果:

已复制                  1 个文件。
SUCCESS
请按任意键继续. . .

如果我们不小心将 copy 错误的写成 copu。如下:

@echo off
copu a.txt bak/b.txt
if %errorlevel%==0 (
    echo SUCCESS
) else (
    echo ERROR
)
pause

运行结果:

'copu' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
ERROR
请按任意键继续. . .

上面结果中输出了 “'copu' 不是内部或外部命令,也不是可运行的程序或批处理文件” 错误信息。我们可以使用重定向符号隐藏这个错误信息,如下:

@echo off
copu a.txt bak/b.txt >nul 2>nul
if %errorlevel%==0 (
    echo SUCCESS
) else (
    echo ERROR
)
pause

运行结果:

ERROR
请按任意键继续. . .

上面的输出结果并没有输出 copu 命令执行的错误信息,只显示我们 echo 给出的提示信息。其中:>nul 2>nul 就是把命令执行的输出信息和错误信息不输出到屏幕,而是输出到一个根本不存在的设备。>nul 等效于 1>nul,>nul 前面的 1 表示输出流,2 表示错误流(1可以省略不写)

常见设备名:

  • con 控制台(键盘和显示器)

  • aux , com1 - com4 所有串口

  • prn , lpt1 - lpt3 所有并口

  • nul 空设备

  • clock$ 电子钟

实例:将输出信息和错误信息重定向到 con 设备。如下:

@echo off
copu a.txt bak/b.txt >con 2>con
if %errorlevel%==0 (
    echo SUCCESS
) else (
    echo ERROR
)
pause

运行结果和不添加 >con 2>con 结果一致。

总结:> 和 >> 符号均可以将命令输出结果输入到指定的文件、nul设备等。其中,> 符号将会覆盖文件旧的内容;>> 符号不会覆盖文件旧的内容,直接将结果写入文件末尾。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号