ZetCode

Windows 命令提示符控制流

最后修改于 2025 年 7 月 14 日

命令提示符中的控制流是指命令如何顺序或有条件地执行。批处理脚本使用控制结构来做出决策和重复操作。这些包括用于条件执行的 if 语句和用于重复的各种循环。理解控制流对于编写有效的自动化脚本至关重要。

命令提示符虽然是一个简单的 shell,但它提供了基本的编程结构。控制流命令使脚本能够适应不同的条件。它们可以响应用户输入、文件存在或变量值。正确使用控制流可以使脚本更加健壮和灵活。

本教程涵盖了 cmd.exe 中的所有主要控制流结构。我们将探讨条件语句、不同类型的循环和错误处理。每个概念都通过实际示例进行演示。到最后,您将能够编写具有适当流程控制的复杂批处理脚本。

基本定义

控制流结构决定了脚本中命令的执行顺序。它们包括基于测试执行代码的条件语句和重复代码块的循环。批处理文件使用这些来创建灵活的自动化。

条件语句评估表达式并选择执行路径。cmd 中的主要条件是 if 语句。它可以比较字符串、检查文件是否存在或评估错误级别。嵌套的 if 可以处理多个条件。

循环结构在条件满足之前重复命令块。Cmd 支持 for 循环(遍历集合)和基于 GOTO 的循环。它们在批处理脚本中服务于不同的目的。循环处理文件、目录或输入数据。

错误处理用于管理执行期间的意外情况。ERRORLEVEL 变量和条件执行运算符(&&、||)有助于处理错误。适当的错误处理可以使脚本在生产环境中更加可靠。

简单的 if 语句

if 语句在条件为真时执行命令。此示例演示了基本的字符串比较和条件执行。

if_example.bat
@echo off
set /p user_input=Enter yes or no: 

if "%user_input%"=="yes" (
    echo You entered yes
) else if "%user_input%"=="no" (
    echo You entered no
) else (
    echo Invalid input
)

此脚本会提示用户输入,并根据输入的值做出不同的响应。if 语句使用 else if 子句检查多个条件。

set /p user_input=Enter yes or no:

提示用户输入文本并将其存储在 user_input 中。/p 选项使 set 在继续之前等待用户输入。

if "%user_input%"=="yes" (
    echo You entered yes
)

将 user_input 变量与“yes”进行比较。如果相等,则执行代码块。引号可安全处理空输入。

) else if "%user_input%"=="no" (
    echo You entered no
)

如果在第一个条件不满足时检查另一个条件。else if 允许在一个语句中进行多个互斥的条件检查。

) else (
    echo Invalid input
)

在先前所有条件均不满足时执行。else 子句处理所有未显式检查的剩余情况。

带条件分支的随机数生成器

您可以使用 %RANDOM% 变量在批处理脚本中生成随机数。此示例生成一个介于 1 和 100 之间的随机数,然后使用 if 根据数字是偶数还是奇数进行分支。

random_example.bat
@echo off
set /a num=%RANDOM% %% 100 + 1
set /a rem=num %% 2

echo Random number: %num%
if %rem%==0 (
    echo The number is even.
) else (
    echo The number is odd.
)

此脚本打印一个随机数,并告诉您它是偶数还是奇数。%RANDOM% 在每次引用时都会生成一个伪随机整数。

检查文件是否存在

if 可以在操作文件之前检查文件是否存在。这可以防止文件处理脚本中的错误。

file_check.bat
@echo off

if exist "config.ini" (
    echo Config file found
    type config.ini
) else (
    echo Config file missing
    echo Creating default config...
    echo [Settings] > config.ini
    echo Theme=Dark >> config.ini
)

此脚本检查配置文件。如果缺少,它将创建一个默认版本。EXIST 条件测试文件是否存在。

if exist "config.ini" (
    echo Config file found
    type config.ini
)

检查当前目录中是否存在 config.ini。如果存在,则显示其内容。引号允许文件名中包含空格。

) else (
    echo Config file missing
    echo Creating default config...
)

当文件不存在时执行。通知用户并准备创建默认配置。

echo [Settings] > config.ini
echo Theme=Dark >> config.ini

使用基本设置创建新的 config.ini。> 覆盖,>> 追加到文件。这些重定向运算符非常强大。

C:\Users\Jano>file_check.bat
Config file missing
Creating default config...

C:\Users\Jano>file_check.bat
Config file found
[Settings]
Theme=Dark

首次运行创建文件,后续运行显示文件。这种模式在初始化脚本中很常见。

文件 For 循环

For 循环处理文件或行等项集。此示例处理目录中的所有文本文件。

for_files.bat
@echo off

echo Processing text files:

for %%f in (*.txt) do (
    echo Found: %%f
    echo Size: %%~zf bytes
    echo Last modified: %%~tf
)

该脚本查找所有 .txt 文件并计算它们的行数。for 循环遍历匹配模式的每个文件。

%%~zf 修改器获取文件大小,%%~tf 获取最后修改时间戳。

带 ERRORLEVEL 的嵌套 if

ERRORLEVEL 检查程序的退出代码。此示例演示了基于命令成功情况的嵌套条件。

errorlevel_example.bat
@echo off
ping -n 1 google.com

if errorlevel 1 (
    echo Ping failed
    if exist backup_connection.bat (
        echo Trying backup connection...
        call backup_connection.bat
    ) else (
        echo No backup available
    )
) else (
    echo Ping successful
)

此脚本检查网络连接并具有备用逻辑。嵌套的 if 处理多种故障场景。

ping -n 1 google.com

使用一个 ping 包测试网络连接。成功将 ERRORLEVEL 设置为 0,失败设置为 1 或更高。

if errorlevel 1 (
    echo Ping failed
)

检查 ERRORLEVEL 是否为 1 或更高。这意味着 ping 失败。ERRORLEVEL 检查在批处理脚本中很常见。

if exist backup_connection.bat (
    echo Trying backup connection...
    call backup_connection.bat
)

嵌套条件检查备份脚本。如果存在,则执行它。call 命令运行另一个批处理文件。

带计数器的 Goto 循环

goto 通过跳转到标签来创建循环。此示例在迭代之间带有延迟进行倒计时。

goto_loop.bat
@echo off
set count=5

:loop
if %count% leq 0 goto end
echo Countdown: %count%
set /a count-=1
ping -n 2 127.0.0.1 >nul
goto loop

:end

echo Blast off!

此脚本从 5 开始倒计时,每次间隔 1 秒。goto 使用标签创建循环结构。

set count=5
:loop
if %count% leq 0 goto end

初始化计数器并启动循环。leq 表示“小于或等于”。当计数达到 0 时,跳转到 :end。

ping -n 2 127.0.0.1 >nul

创建 1 秒延迟。每次 ping 等待 1 秒,-n 2 表示两次 ping。>nul 隐藏 ping 输出。

goto loop
:end

返回 :loop 标签进行下一次迭代。:end 标记循环完成后的退出点。

C:\Users\Jano>goto_loop.bat
Countdown: 5
Countdown: 4
Countdown: 3
Countdown: 2
Countdown: 1
Blast off!

倒计时显示,间隔 1 秒。

带 choice 的交互式菜单

choice 命令允许您在批处理脚本中创建交互式菜单。它会等待用户按键,并根据选择设置 ERRORLEVEL 变量。这对于简单的菜单和分支逻辑很有用。

menu_example.bat
@echo off

:main
cls
echo --- Subroutine Menu ---
echo 1. Greet
echo 2. Show directory
echo 3. Exit

set /p choice=Choose 1-3: 

if "%choice%"=="1" call :greet
if "%choice%"=="2" call :showdir
if "%choice%"=="3" goto end
goto main

:greet
echo Hello from a subroutine!
pause
goto :eof

:showdir
dir /b
pause
goto :eof

:end
echo Exiting script.

此脚本显示一个菜单,并根据用户的按键执行相应的操作。choice 根据所选选项将 ERRORLEVEL 设置为 1、2 或 3。脚本会一直循环,直到用户选择退出。

if "%choice%"=="1" call :greet
if "%choice%"=="2" call :showdir
if "%choice%"=="3" goto end

这些行检查用户的选择并调用相应的子程序。call 命令用于调用子程序。

:greet
echo Hello from a subroutine!
pause
goto :eof

此子程序显示问候消息,并在返回前等待用户输入。

来源

Windows 命令参考

本教程涵盖了命令提示符中的基本控制流结构。掌握这些概念可以编写强大的批处理脚本进行自动化。

作者

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