为环境变量分配值/字符串
最好使用启用命令扩展的以下语法来定义或修改环境变量:
set "var=text"
命令 设置完毕 ,参数为 "variable=value"
.
只要默认启用命令扩展,参数字符串就可以像所有命令一样用双引号引起来。
如果未使用双引号 variable=value
,则命令 集会 将第一个等号后到行尾的所有内容(包括不可见的空格和行尾的水平制表符)解释为字符串值以分配给变量。
变量的名称以第一个非空白字符(如果使用双引号,则在双引号后)开始,到第一个等号左侧结束。分配给变量的值从第一个等号右侧开始,到行尾或最后一个双引号结束。
set VAR = TEXT
上面的命令行创建一个名为 VAR Space 的,并将字符串Space TEXT 给该变量。
使用
set var="text"
文本以及所有尾随空格和制表符的文本 var
分配给变量 var
如何设置带空格的环境变量? 的答案
例子:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "var=text"
set "var = text"
set "var1=and more text"
set var2="and more text"
set var3="text with 1 trailing space"
set var
echo var3=%var3%^<- Do you see the trailing space?
echo/
set UnwantedSpaceVar=Hello
echo %UnwantedSpaceVar%! ^<- Where does the space come from?
echo/
echo There is a trailing space after Hello in this code snippet.
echo/
set "TrailingSpacesIgnored=Hi"
echo %TrailingSpacesIgnored%! ^<- The 3 trailing spaces above are ignored.
echo/
endlocal
pause
运行此小批量代码将产生以下输出:
var=text
var = text
var1=and more text
var2="and more text"
var3="text with 1 trailing space"
var3="text with 1 trailing space" <- Do you see the trailing space?
Hello ! <- Where does the space come from?
There is a trailing space after Hello in this code snippet.
Hi! <- The 3 trailing spaces above are ignored.
即使文本本身包含一个或多个双引号,也可以用引号 variable=value
括
set "Quote=""
值为的 Quote
变量 "
。命令 set 将第一个等号左到最后一个双引号之后的所有内容解释为值,并将其分配给名称位于第一个引号和第一个等号之间的变量。
注意: inside 和 next "
或 &
或 的 &&
字符串值 ||
甚至可能被 set "variable=value"
误解,从而导致意外行为,正如在运行以下两行批处理文件时看到的那样:
@echo off
set "Variable=Value with one double quote in the middle" & echo Oh, there is something wrong here!"
Value ,并 one double quote in the middle" & 的另一个命令行 Oh, there is something wrong here!
是分配给环境变量的字符串,但分配给变量的只是 Value with one double quote in the middle
中间和之后 "
的行的其余部分, &
被解释为条件运算符,而不是字面上被解释为要执行的附加命令 cmd.exe
或 &&
之后 ||
存在相同的问题, "
中间有 0 个或更多空格/制表符。 此问题不是由命令 set 的 。 它是由 Windows 命令处理器引起的,它将行拆分为带有 set 命令 echo with 有条件执行 echo echo 行。
禁用命令扩展时的变量分配
如果在批处理文件中禁用了命令扩展名(或在 Windows 注册表中禁用,这种情况非常少见,我从未在任何 Windows 计算机上见过),则无法使用 set "variable=value"
命令语法 setlocal DisableExtensions
。执行批处理文件时将导致语法错误。
仅可以 set variable=value
在禁用命令扩展的情况下使用,此时值也可以包含双引号,并且必须注意尾随空格/制表符,因为它们也被分配给环境变量。
在命令提示符窗口中运行 cmd /?
, setlocal /?
获取有关命令扩展以及哪些命令受命令扩展影响的更多信息。注意:受影响命令的输出列表未 退出, GOTO :EOF 返回到哪里? 的答案中所述。
通过算术表达式赋值变量
使用 带选项 的 /A
集会完全改变第二个参数的解析,即后面的字符串 set /A
。使用选项 /A
作为第一个参数时,第二个字符串被解释为 算术表达式 ,因此处理方式与将字符串值分配给环境变量完全不同。环境变量始终是字符串类型,而不是整数类型。
该选项的使用 /A
需要启用命令扩展,否则命令 集 将完全忽略该行的其余部分而不会出现任何错误消息。
大多数情况下,不建议使用算术表达式将数字分配给环境变量,即使用 set /A var=1
. set "var=1"
或仅 set var=1
(并且没有尾随空格)会更快一些,因为环境变量始终是字符串类型。
在算术表达式中,空格被解释为变量名、数字和运算符的分隔符。因此,命令行 set /A var = 为
不会 像上面那样定义 名为 从 Space 的变量,其字符串 (批处理文件包含 Space set var = 1
1。 set /A var = 1
在 VAR 字符串 1 转换 1
为值为整数并返回到具有两个值 0x31 和 0x00(以空值结尾的字符串)的字符串后,定义名为 VAR 的 1
1 1
。
通过提示分配变量
另外,使用 带 选项的 /P
集会改变变量名和等号后的字符串的解析。变量名和等号后的字符串被解释为要输出的提示文本,而不是要分配给环境变量的字符串。
环境变量被分配由提示用户输入的字符串(或从文件或命令/应用程序重定向),或者在用户在按下RETURN或ENTER,如果在提示之前未定义,则保持其当前值仍然未定义。
该选项的使用 /P
需要启用命令扩展,否则命令 集 将完全忽略该行的其余部分而不会出现任何错误消息。
提示用户输入字符串的最常用语法是:
set /P var="Please enter something: "
命令 集会 在打印之前自动删除提示文本周围的双引号,以处理 STDOUT (如果未重定向,则为控制台窗口)。
但工作也同样如此:
set /P "var=Please enter something: "
请阅读 此答案 以获取有关提示文本解析以及如何输出带有双引号的提示文本的更多详细信息。