ZetCode

命令提示符变量教程

最后修改于 2025 年 7 月 15 日

命令提示符中的变量对于存储和操作数据至关重要。它们可以包含字符串、数字、路径和其他信息。变量能够实现批处理脚本和命令行操作的动态行为。理解变量是有效实现 Windows 自动化的关键。

命令提示符支持两种主要的变量类型:环境变量和本地脚本变量。环境变量会跨会话持久存在,并且是系统范围的。本地变量仅存在于脚本或命令会话中。这两种类型使用相似的语法,但具有不同的作用域。

变量通过将其名称括在百分号 (%) 中来引用。它们可以在会话期间创建、修改和删除。系统环境变量由 Windows 预定义。用户定义变量为自定义脚本和配置提供了灵活性。

本教程涵盖变量的创建、修改和实际使用。我们将探讨基本操作、字符串操作、算术运算和脚本示例。这些概念构成了高级批处理编程和系统管理的基础。

基本变量操作

此示例演示了变量的创建、显示和修改。基本操作是更复杂变量使用的基础。

variables.bat
@echo off
set MESSAGE=Hello there!
echo Variable value: %MESSAGE%
set MESSAGE=Hi there!
echo Modified value: %MESSAGE%
set MESSAGE=

在此脚本中,我们创建了一个名为 MESSAGE 的变量,显示其值,修改它,然后将其清除。@echo off 命令抑制命令回显。

set MESSAGE=Hello there!

set 命令创建一个名为 MESSAGE 的新变量,值为“Hello there!”。set 命令用于变量的创建和修改。

echo Variable value: %MESSAGE%

显示 MESSAGE 的当前值。变量名周围的百分号表示应将其展开为其值。

set MESSAGE=New Value

使用新值更新 MESSAGE。在脚本执行期间,变量可以根据需要更改。

set MESSAGE=

通过将 MESSAGE 变量设置为空来删除它。这会清除内存中的变量,释放资源。

C:\Users\Jano>variables.bat
Variable value: Hello there!
Modified value: Hi there!

输出显示了变量的初始值和修改后的值。删除操作不会产生可见输出。

环境变量

环境变量提供系统信息和配置设置。它们在所有命令提示符会话中都可用。

environment.bat
@echo off
echo System root: %SystemRoot%
echo User profile: %USERPROFILE%
echo Path: %PATH%
set TEMP_VAR=Temporary
echo Temp var: %TEMP_VAR%

此脚本演示了访问系统环境变量和创建临时变量。系统变量始终可用。

echo System root: %SystemRoot%

该行显示了 Windows 安装目录路径。SystemRoot 是所有 Windows 系统上可用的预定义环境变量。

echo User profile: %USERPROFILE%

我们显示了当前用户的配置文件目录路径。此变量有助于在脚本中创建用户特定的路径。

echo Path: %PATH%

我们列出了 Windows 搜索可执行文件的目录。PATH 变量包含多个以分号分隔的路径。

set TEMP_VAR=Temporary

set 命令创建一个临时环境变量。此类变量仅存在于当前的命令提示符会话中。

用户输入变量

变量可以捕获用户输入以实现交互式脚本。这使得基于运行时输入的动态行为成为可能。

input.bat
@echo off
set /p username=Enter your name: 
echo Hello, %username%!
set /p num1=Enter first number: 
set /p num2=Enter second number: 
set /a sum=%num1% + %num2%
echo Sum: %sum%

此脚本演示了捕获用户输入和执行计算。/p 开关启用提示符式输入。

set /p username=Enter your name:

它提示用户输入他们的名字并将其存储在 username 中。/p 开关使 set 等待输入,而不是直接赋值。

echo Hello, %username%!

我们使用捕获的输入显示个性化的问候。用户输入变量使脚本更具交互性和灵活性。

set /a sum=%num1% + %num2%

该行执行两个数字的算术加法。/a 开关表示算术运算而不是字符串赋值。

C:\Users\Jano>input.bat
Enter your name: Jan
Hello, Jan!
Enter first number: 5
Enter second number: 7
Sum: 12

运行时,脚本与用户交互并执行计算。输入值决定了脚本的输出。

字符串操作

变量可以存储和操作字符串。命令提示符通过变量扩展提供了多种字符串操作。

strings.bat
@echo off
set text=The quick brown fox

setlocal enabledelayedexpansion
set /a len=0

:loop
if not "!text:~%len%,1!"=="" (
  set /a len+=1
  goto loop
)
echo Original: %text%
echo Substring: %text:~4,5%
echo Length: %len% letters

set text=%text:fox=dog%
echo Replaced: %text%

此脚本演示了子字符串提取、长度计算和字符串替换。字符串操作使用特殊语法。

setlocal enabledelayedexpansion

这启用了延迟变量扩展。它允许我们在运行时访问在代码块(如循环或 if 语句中)内更新了值的变量。在我们的例子中,它允许我们使用 !text! 语法来访问即使在循环中修改过的 text 变量。

set /a len=0

:loop
if not "!text:~%len%,1!"=="" (
  set /a len+=1
  goto loop
)

此代码通过遍历每个字符直到到达末尾来计算字符串的长度。循环继续,直到没有字符为止。

echo Substring: %text:~4,5%

我们提取从位置 4(从 0 开始的索引)开始的 5 个字符。~ 运算符支持对变量进行子字符串操作。

set text=%text:fox=dog%
echo Replaced: %text%

在这里,我们将变量中的所有“fox”替换为“dog”。替换操作使用 :search=replace 语法。

本地与全局变量

变量在批处理脚本中可以具有不同的作用域。理解作用域可以防止意外的变量交互。

scope.bat
@echo off
set GLOBAL_VAR=Available everywhere
echo Before setlocal: %GLOBAL_VAR%
setlocal
set LOCAL_VAR=Local only
echo Inside setlocal: %LOCAL_VAR%
endlocal
echo After endlocal: %LOCAL_VAR%
echo Global still exists: %GLOBAL_VAR%

此脚本演示了使用 setlocal 和 endlocal 进行变量作用域。本地变量在 endlocal 后消失。

setlocal

setlocal 命令开始一个本地作用域,在该作用域中变量更改是临时的。setlocal 之后的命令可以修改变量而不会产生全局影响。

set LOCAL_VAR=Local only

我们创建了一个仅在本地作用域中存在的变量。此类变量在 endlocal 时自动清理。

endlocal

该行结束本地作用域,并丢弃自 setlocal 以来进行的所有变量更改。全局变量不受影响。

来源

Windows 命令参考

本教程涵盖了命令提示符变量的基本概念。掌握这些基础知识可以创建强大的批处理脚本并自动化任务。

作者

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