ZetCode

Windows 命令提示符 I/O 重定向

最后修改于 2025 年 7 月 14 日

命令提示符中的 I/O 重定向允许控制输入和输出流。它能够将命令输出发送到文件或其他命令。输入可以从文件读取,而不是从键盘读取。这个强大的功能有助于自动化任务和高效地处理数据。

Cmd 处理三个标准流:stdin(输入)、stdout(输出)和 stderr(错误)。这些可以使用特殊运算符进行重定向。流可以组合、过滤或保存以供将来分析。掌握重定向是有效使用命令行关键。

重定向运算符包括 >、>>、<、| 和 2>。它们修改命令与流的交互方式。一些运算符会覆盖文件,而另一些则会追加。管道通过将一个命令的输出发送到另一个命令的输入来连接命令。

本教程涵盖了 cmd 中所有主要的 I/O 重定向技术。我们将探讨文件重定向、管道、流合并和错误处理。示例演示了从简单到高级的实际应用。

基本定义

理解这些术语对于使用 I/O 重定向至关重要

标准输入 (stdin):默认输入流(键盘)。使用 < 运算符重定向。

标准输出 (stdout):默认输出流(控制台)。使用 > 或 >> 运算符重定向。

标准错误 (stderr):错误输出流(控制台)。使用 2> 运算符重定向。

管道 (|):将一个命令的 stdout 连接到另一个命令的 stdin。允许命令链式操作。

追加 (>>):将输出添加到现有文件,而不是覆盖。保留先前的内容。

基本输出重定向

最简单的重定向是将命令输出发送到文件而不是屏幕。这可以创建日志或保存结果以供将来使用。

redirect.bat
@echo off
echo Redirecting output to file...
dir > filelist.txt
echo Done. Check filelist.txt

此脚本演示了基本输出重定向。dir 命令的输出将转到 filelist.txt,而不是控制台。

dir > filelist.txt

将目录列表输出重定向到 filelist.txt。> 运算符会在文件丢失时创建文件,或覆盖现有文件。

echo Done. Check filelist.txt

显示一条消息,确认重定向已成功。echo 的输出仍然显示在控制台上,因为它没有被重定向。

C:\>redirect.bat
Redirecting output to file...
Done. Check filelist.txt

运行脚本会创建包含目录列表的 filelist.txt 文件。控制台仅显示 echo 消息。

追加输出

追加重定向会将内容添加到现有文件中,而不会丢失先前的内容。这对于随着时间累积的日志非常有用。

append.bat
@echo off
echo First line > log.txt
echo Second line >> log.txt
echo Third line >> log.txt
type log.txt

此脚本展示了如何逐步构建文件。每次 echo 都会追加到 log.txt,而不会擦除之前的行。

echo First line > log.txt

使用 > 创建带有初始内容的 log.txt。随后的命令使用 >> 来追加,而不是覆盖。

echo Second line >> log.txt

将第二行添加到 log.txt。>> 运算符会在需要时创建文件,但如果文件已存在,则会保留其内容。

type log.txt

显示最终文件内容以验证所有行是否已正确添加。type 命令显示文件内容。

C:\>append.bat
First line
Second line
Third line

输出显示 log.txt 的累积内容。每次 echo 都将其行添加到不断增长的文件中。

错误重定向

错误消息通常会与常规输出混合显示在屏幕上。重定向 stderr 可以分离错误,以便更好地处理。

error.bat
@echo off
dir nonexistent 2> errors.txt
dir existent > output.txt 2>&1
echo Error messages:
type errors.txt
echo Output:
type output.txt

此脚本演示了错误流处理。第一个命令会生成一个错误,第二个命令显示合并的流。

dir nonexistent 2> errors.txt

尝试列出不存在的目录,并将错误重定向到 errors.txt。2> 运算符仅捕获 stderr。

dir existent > output.txt 2>&1

列出存在的目录,将 stdout 和 stderr 合并到 output.txt。2>&1 将 stderr 重定向到 stdout。

type errors.txt

显示捕获的错误消息。这表明了如何将错误与正常输出分开并单独检查。

C:\>error.bat
Error messages:
File Not Found
Output:
 Volume in drive C is OS
 Directory of C:\existent
...

输出显示了分离的错误和合并的流。实际内容取决于目录是否存在。

输入重定向

命令可以从文件读取输入,而不是从键盘读取。这可以自动化交互式程序或处理准备好的输入。

input.bat
@echo off
echo John > names.txt
echo Jane >> names.txt
echo Bob >> names.txt
sort < names.txt

此脚本演示了输入重定向。它创建了一个包含名称的文件,然后使用文件输入对其进行排序。

echo John > names.txt

创建包含第一个名称的 names.txt。随后的追加会构建一个要处理的名称列表。

sort < names.txt

按字母顺序对 names.txt 中的行进行排序。< 运算符将文件内容作为命令输入。

C:\>input.bat
Bob
Jane
John

输出显示了来自输入文件的排序后的名称。sort 命令从未等待键盘输入。

管道命令

管道通过将一个命令的输出发送到另一个命令的输入来连接命令。这可以实现强大的多步骤处理。

piping.bat
@echo off
dir | find "txt" > textfiles.txt
echo Text files found:
type textfiles.txt

此脚本演示了命令管道。它列出目录内容,过滤出文本文件,并保存结果。

dir | find "txt"

将目录列表通过管道传递给 find 命令,该命令过滤出包含“txt”的行。| 连接了这两个命令。

> textfiles.txt

将过滤后的输出重定向到 textfiles.txt。这结合了管道和文件重定向以进行最终存储。

C:\>piping.bat
Text files found:
05/01/2025  12:00 PM               120 notes.txt
05/01/2025  12:00 PM               240 report.txt

输出仅显示目录列表中的 .txt 文件。确切的文件取决于您的目录内容。

来源

Windows 命令重定向参考

本教程涵盖了命令提示符中 essential 的 I/O 重定向技术。掌握这些概念可以实现强大的命令行自动化和数据处理。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。至今,我已撰写了超过 1400 篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。