Windows 命令提示符控制流
最后修改于 2025 年 7 月 14 日
命令提示符中的控制流是指命令如何顺序或有条件地执行。批处理脚本使用控制结构来做出决策和重复操作。这些包括用于条件执行的 if 语句和用于重复的各种循环。理解控制流对于编写有效的自动化脚本至关重要。
命令提示符虽然是一个简单的 shell,但它提供了基本的编程结构。控制流命令使脚本能够适应不同的条件。它们可以响应用户输入、文件存在或变量值。正确使用控制流可以使脚本更加健壮和灵活。
本教程涵盖了 cmd.exe 中的所有主要控制流结构。我们将探讨条件语句、不同类型的循环和错误处理。每个概念都通过实际示例进行演示。到最后,您将能够编写具有适当流程控制的复杂批处理脚本。
基本定义
控制流结构决定了脚本中命令的执行顺序。它们包括基于测试执行代码的条件语句和重复代码块的循环。批处理文件使用这些来创建灵活的自动化。
条件语句评估表达式并选择执行路径。cmd 中的主要条件是 if 语句。它可以比较字符串、检查文件是否存在或评估错误级别。嵌套的 if 可以处理多个条件。
循环结构在条件满足之前重复命令块。Cmd 支持 for 循环(遍历集合)和基于 GOTO 的循环。它们在批处理脚本中服务于不同的目的。循环处理文件、目录或输入数据。
错误处理用于管理执行期间的意外情况。ERRORLEVEL 变量和条件执行运算符(&&、||)有助于处理错误。适当的错误处理可以使脚本在生产环境中更加可靠。
简单的 if 语句
if 语句在条件为真时执行命令。此示例演示了基本的字符串比较和条件执行。
@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
根据数字是偶数还是奇数进行分支。
@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 可以在操作文件之前检查文件是否存在。这可以防止文件处理脚本中的错误。
@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 循环处理文件或行等项集。此示例处理目录中的所有文本文件。
@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
检查程序的退出代码。此示例演示了基于命令成功情况的嵌套条件。
@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
通过跳转到标签来创建循环。此示例在迭代之间带有延迟进行倒计时。
@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
变量。这对于简单的菜单和分支逻辑很有用。
@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
此子程序显示问候消息,并在返回前等待用户输入。
来源
本教程涵盖了命令提示符中的基本控制流结构。掌握这些概念可以编写强大的批处理脚本进行自动化。