在 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设备等。其中,> 符号将会覆盖文件旧的内容;>> 符号不会覆盖文件旧的内容,直接将结果写入文件末尾。