ZetCode

Windows 命令提示符管道教程

最后修改于 2025 年 7 月 14 日

管道是 Windows 命令提示符的一项强大功能,它允许您将多个命令链接在一起。管道符号(|)将一个命令的输出作为另一个命令的输入。通过按顺序组合简单命令,可以实现复杂的数据处理。

管道遵循 Unix 的理念,即创建小巧、专注且能做好一件事的工具。通过将这些工具与管道结合使用,可以高效地解决复杂问题。管道对于在不创建临时文件的情况下过滤、排序和转换命令输出特别有用。

管道机制通过在命令之间创建临时内存缓冲区来工作。第一个命令的标准输出成为第二个命令的标准输入。可以链接多个管道以创建任意复杂度的处理管道。

本教程将介绍管道基础知识并演示实际示例。您将学会有效地组合命令来处理文本、过滤输出和自动化任务。这些技术对于高效的命令行使用和脚本编写至关重要。

基本管道概念

在深入示例之前,让我们先定义一些与管道相关的关键术语和概念。理解这些将有助于您有效地使用管道。

管道符号 (|): 用于连接命令的竖线字符。它告诉 cmd 将第一个命令的输出重定向到第二个命令的输入。

标准流: 命令有三个标准流——输入 (stdin)、输出 (stdout) 和错误 (stderr)。管道将一个命令的 stdout 连接到另一个命令的 stdin。

过滤命令: 用于处理来自管道的输入的命令。例如 find、sort 等。当未提供文件名时,它们通常读取 stdin。

重定向与管道: 重定向(> 或 <)与文件配合使用,而管道直接连接命令。两者都可以组合在复杂的命令序列中。

管道线: 由管道连接的一系列命令。管道中的每个命令都会处理数据并将其传递给下一个命令。

示例 1:过滤命令输出

最常见的管道用法是过滤命令输出。此示例展示了如何仅显示来自详细命令输出的相关行。

filtering.bat
@echo off
systeminfo | find "Total Physical Memory"
ipconfig | find "IPv4"

此脚本演示了如何使用 find 从命令输出中提取特定信息。管道将 systeminfo 和 ipconfig 的输出发送到 find。

systeminfo | find "Total Physical Memory"

systeminfo 生成大量的系统数据。管道将此发送到 find,find 仅显示包含“Total Physical Memory”的行。

ipconfig | find "IPv4"

ipconfig 显示网络配置。管道过滤输出,仅显示 IPv4 地址,隐藏其他网络详细信息。

C:\>filtering.bat
Total Physical Memory:     16,290 MB
   IPv4 Address. . . . . . . . . . . : 192.168.1.100

输出仅显示过滤后的信息。您的实际内存大小和 IP 地址将根据您的系统配置而有所不同。

示例 2:排序命令输出

管道可以处理和转换数据。此示例演示了按字母顺序对目录列表进行排序。

sorting.bat
@echo off
dir /b | sort
dir /b *.txt | sort /r

此脚本展示了两个排序示例。第一个是正常排序,第二个是反向排序(/r)并过滤文本文件。

dir /b | sort

dir /b 以简洁格式(仅文件名)列出文件。管道将此列表发送到 sort,sort 会按字母顺序排列它们。

dir /b *.txt | sort /r

仅列出 .txt 文件并按反向顺序排序。/r 开关使 sort 按 Z 到 A 的顺序显示结果。

C:\>sorting.bat
Documents
Downloads
Music
Pictures
Videos
notes.txt
report.txt
todo.txt

输出显示排序后的目录内容。首先是所有文件/目录 A-Z,然后是仅 .txt 文件 Z-A。您的实际文件将有所不同。

示例 3:计算文件中的行数

管道可以组合多个命令进行复杂处理。此示例计算跨文件中匹配某个模式的行数。

counting.bat
@echo off
type *.log | find /c "ERROR"
find "WARNING" *.log | find /c /v ""

此脚本演示了两种计数方法。第一个计数所有 .log 文件中的 ERROR 行。第二个使用不同的方法计数 WARNING 行。

type *.log | find /c "ERROR"

type 组合所有 .log 文件的内容。find /c 计数包含“ERROR”的行。/c 开关仅返回计数。

find "WARNING" *.log | find /c /v ""

find 首先查找 .log 文件中的 WARNING 行。第二个 find 计数所有行(/v "" 反转空字符串匹配,计数所有行)。

C:\>counting.bat
---------- LOG1.LOG: 3
---------- LOG2.LOG: 1
---------- LOG3.LOG: 0
3
---------- LOG1.LOG: 5
---------- LOG2.LOG: 2
---------- LOG3.LOG: 1
8

输出显示每个文件的 ERROR 计数和总计,然后是每个文件的 WARNING 计数和总计。数字取决于您的日志文件。

示例 4:处理多个文件

管道支持批量处理多个文件。此示例搜索文件中的文本并格式化输出。

multifile.bat
@echo off
findstr /s /i "important" *.txt *.ini | more
findstr /s /i "password" *.txt *.ini | sort | more

此脚本递归(/s)搜索文件中的文本。第一个命令查找“important”,第二个命令查找“password”并对结果进行排序。

findstr /s /i "important" *.txt *.ini | more

findstr 在当前和子目录中搜索所有 .txt 和 .ini 文件(/s)。/i 使搜索不区分大小写。more 对长输出进行分页。

findstr /s /i "password" *.txt *.ini | sort | more

搜索“password”,按字母顺序排序结果,然后分页。这个三命令管道展示了管道的链接。

C:\>multifile.bat
config.ini:admin_password=secret
notes.txt:The important meeting is tomorrow
settings.ini:important_flag=1

config.ini:admin_password=secret
notes.txt:temp_password=12345
notes.txt:user_password=abcde

输出显示文件中匹配的行。第二个命令的输出已排序。按空格键翻页以查看更多结果。

示例 5:复杂数据处理

这个高级示例演示了使用多个管道命令分析系统信息的阶段性数据处理。

complex.bat
@echo off
systeminfo | findstr /i /r "memory.*[0-9]" | sort /r
tasklist | findstr /i "chrome" | find /c /v ""

脚本展示了两个复杂的管道。第一个处理内存信息,第二个计数 Chrome 进程。

systeminfo | findstr /i /r "memory.*[0-9]" | sort /r

systeminfo 的输出被发送到 findstr,findstr 查找包含数字的内存相关行(/r 使用正则表达式)。结果按反向顺序排序。

tasklist | findstr /i "chrome" | find /c /v ""

tasklist 显示正在运行的进程。findstr 过滤 Chrome 实例。find 通过计数所有非空行来计数它们。

C:\>complex.bat
Total Physical Memory:     16,290 MB
Available Physical Memory: 8,142 MB
Virtual Memory: Max Size:  18,690 MB
Virtual Memory: Available: 10,242 MB
Virtual Memory: In Use:    8,448 MB
5

输出显示按反向顺序排序的内存信息,然后是 Chrome 进程的计数。数字因系统而异。

来源

Windows 命令参考

本教程通过实际示例介绍了命令提示符管道。管道支持强大的命令组合,可用于高效的数据处理和系统管理任务。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面有十多年的经验。