ZetCode

Windows 命令提示符 For 循环

最后修改于 2025 年 7 月 14 日

Windows 命令提示符中的 For 循环是一种强大的构造,用于自动化重复性任务。它可以迭代文件、目录、数字和文本数据。For 循环对于批处理脚本和命令行自动化至关重要。它们有助于减少手动工作并实现复杂的操作。

cmd.exe 中的 For 循环有几种变体,每种都有不同的用途。基本语法包括用于迭代文件、目录、数字范围和命令输出的选项。理解这些变体可以创建高效的自动化脚本。For 循环可以直接在命令提示符和批处理文件中使用。

本教程通过实际示例涵盖了所有 for 循环变体。我们将探讨文件处理、数字迭代、文本解析和目录遍历。每个示例都演示了 For 循环的实际应用。到最后,您将能够将 For 循环实现到您自己的脚本中。

基本 For 循环语法

for 命令有几种形式,每种都有特定的语法和开关。最常见的形式处理文件集或文本数据。基本语法在批处理文件中使用百分号进行变量替换。

basic_for.bat
@echo off
for %%i in (1 2 3 4 5) do (
    echo Number: %%i
)

这个简单的例子演示了 For 循环的基本结构。它迭代数字列表并回显每个数字。%%i 是循环变量。

for %%i in (1 2 3 4 5) do

使用括号括起来的列表中的变量 %%i 定义了一个 for 循环。do 关键字位于要执行的命令之前。

在批处理文件中需要双百分号 (%%),以便命令处理器知道将其视为循环变量,而不是字面上的 % 字符。这可以避免与同样使用 % 的环境变量(例如 %PATH%)混淆。

echo Number: %%i

为每次迭代执行的命令。%%i 被替换为当前项目值。多个命令可以分组在括号中。

C:\Users\Jano>basic_for.bat
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

输出显示循环遍历列表中的所有项目。这种基本模式适用于任何以空格分隔的项目。

迭代文件

For 循环通常用于处理与模式匹配的文件。此示例显示了如何处理当前目录中的文件。

file_loop.bat
@echo off
echo Text files in current directory:
for %%f in (*.txt) do (
    echo Processing: %%f
    type %%f
)

此脚本查找所有 .txt 文件并显示其内容。%%f 变量依次保存每个文件名。type 命令显示文件内容。

for %%f in (*.txt) do

它使用通配符模式 *.txt 来匹配所有文本文件。%%f 变量接收每个匹配的文件名。该模式不区分大小写。

type %%f

它显示每个文本文件的内容。这演示了在循环体内处理每个匹配的文件。可以执行多个操作。

数字 For 循环

/l 开关创建迭代数字范围的数字 for 循环。这对于计数和重复操作很有用。

numeric_loop.bat
@echo off
echo Counting from 1 to 10:
for /l %%n in (1,1,10) do (
    echo %%n
)

echo Counting even numbers 2 to 20:
for /l %%n in (2,2,20) do (
    echo %%n
)

此示例显示了两个数字循环。第一个计数 1-10,第二个计数偶数 2-20。步长值控制增量大小。

for /l %%n in (1,1,10) do

以 1 为步长从 1 循环到 10。/l 表示数字循环。参数为(开始、步长、结束)。所有值都必须是整数。

for /l %%n in (2,2,20) do

以 2 为步长从 2 计数到 20(偶数)。步长值可以调整用于不同的序列。负步长向下计数。

C:\Users\Jano>numeric_loop.bat
Counting from 1 to 10:
1
2
3
...
10
Counting even numbers 2 to 20:
2
4
6
...
20

解析命令输出

For /f 循环解析命令或文件的文本输出。此强大功能使得逐行处理命令结果成为可能。

parse_output.bat
@echo off
echo Running processes:
for /f "tokens=1 delims=," %%p in ('tasklist /fo csv /nh') do (
    echo Process: %%~p
)

echo System drives:
for /f %%d in ('wmic logicaldisk get name ^| findstr ":"') do (
    echo Found drive: %%d
)

此脚本演示了解析命令输出。第一个循环处理 tasklist 结果,第二个查找磁盘驱动器。/f 开关启用解析。

for /f "tokens=1 delims=," %%p in ('tasklist /fo csv /nh') do

解析 tasklist 命令的 CSV 输出。“tokens=1 delims=,” 提取第一列。/nh 抑制标题。%%p 接收每个进程名。

for /f %%d in ('wmic logicaldisk get name ^| findstr ":"') do (
    echo Found drive: %%d
)

使用 WMIC 查找磁盘驱动器。脱字符 (^) 转义管道符用于命令。%%d 接收每个驱动器字母。简单的输出不需要 token/delimiter。

目录递归

For /r 递归处理目录及其子目录。这对于跨目录树的操作很有用。

recursive_loop.bat
@echo off
echo All .exe files in C:\Windows and subfolders:
for /r "C:\Windows" %%f in (*.exe) do (
    echo Found: %%~nxf
    echo Path: %%~dpf
)

echo Empty directories in current folder tree:

for /r /d %%d in (.) do (
    dir /a /b "%%d" | findstr "." >nul || echo Empty: %%d
)

此示例显示了递归文件搜索和空目录检测。/r 开关启用通过子目录进行递归。

for /r "C:\Windows" %%f in (*.exe) do

递归搜索 C:\Windows 中的 .exe 文件。%%f 获取每个文件的完整路径。%%~nxf 提取名称+扩展名,%%~dpf 获取驱动器+路径。

for /r /d %%d in (.) do

/d 开关处理目录而不是文件。(.) 表示递归中的当前目录。与 dir/findstr 结合使用,它可以检测空目录。

处理文本文件中的行

For 循环还可以处理文本文件的每一行。这对于读取配置文件、列表或任何基于行的文件很有用。for /f 命令读取每一行并将其赋给一个变量。

fruits.txt
apple
banana
cherry
date

这是一个简单的文本文件,包含水果名称,每行一个。我们将使用批处理脚本中的 for 循环来读取此文件。

read_fruits.bat
@echo off
for /f "delims=" %%l in (fruits.txt) do (
    echo Fruit: %%l
)

此脚本读取 fruits.txt 并回显每个水果名称。delims= 选项确保整行都被读取,包括空格。此技术对于逐行处理列表或配置文件很有用。

C:\Users\Jano>read_lines.bat
Fruit: apple
Fruit: banana
Fruit: cherry
Fruit: date

此示例演示了如何在批处理脚本中使用 for /f 来处理文本文件的每一行。

使用 for /l 生成乘法表

for /l 循环非常适合生成数字序列。在这里,我们使用它来打印 1 到 10 的 7 的乘法表。

table7.bat
@echo off
for /l %%i in (1,1,10) do (
    set /a result=7*%%i
    call echo 7 x %%i = %%result%%
)

此脚本使用 set /a 进行算术运算,并使用 call 在循环内展开变量。输出是

7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
...
7 x 10 = 70

这演示了如何在批处理脚本中使用 for /l 进行数字计算和重复操作。

来源

Microsoft For 命令文档

本教程涵盖了 Windows 命令提示符中的基本 for 循环技术。这些示例为构建强大的自动化脚本提供了基础。通过尝试不同的参数进行练习,以掌握 for 循环的能力。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。到目前为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面有十多年的经验。