在cmd中使用'set var = text'命令后,为什么没有带'echo%var%'的字符串输出?

Log*_*ern 7 cmd batch-file

我用set命令在cmd中设置了一个变量,然后尝试了echo.

这是一个例子:

C:\Users\Logan>set var = text

C:\Users\Logan>set var
var = text

C:\Users\Logan>echo %var%
%var%

C:\Users\Logan>
Run Code Online (Sandbox Code Playgroud)

有没有办法强制cmd echo变量而不是原始文本?

Mof*_*ofi 18

将值/字符串分配给环境变量

启用命令扩展时,默认情况下最好使用:

set "var=text"
Run Code Online (Sandbox Code Playgroud)

命令已设置且参数为"variable=value".

只要默认情况下启用了命令扩展,参数字符串就可以像所有命令一样用双引号括起来.

如果没有使用双引号variable=value,则命令将所有内容解释为第一个等号后面的行尾(包括不可见空格)和行尾的水平制表符作为要分配给变量的字符串值.

变量的名称以第一个非空白字符开头(如果使用双引号之后),则结束左边第一个等号.分配给变量的值从第一个等号开始,到行尾或最后双引号结束.

set VAR = TEXT
Run Code Online (Sandbox Code Playgroud)

创建一个名为VAR的环境变量,Space并将字符串SpaceTEXT分配给此变量.

也用

set var="text"
Run Code Online (Sandbox Code Playgroud)

通常不正确,因为这会导致为var包含引号和所有尾随空格和制表符的文本赋值变量.现在var在带有周围引号的另一个代码行上引用通常会导致错误消息,因为变量会自己保留带引号的文本.有关更多详细信息,请参阅如何使用空格设置环境变量的答案

例:

@echo off
setlocal
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
Run Code Online (Sandbox Code Playgroud)

运行这个小批量代码会产生输出:

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.
Run Code Online (Sandbox Code Playgroud)

包围variable=value在引号即使文本本身含有1个或多个双引号来完成.

set "Quote=""
Run Code Online (Sandbox Code Playgroud)

该行Quote用值定义变量".命令将第一个等号后面的所有内容解释为最后一个双引号作为值,以分配给名称在第一个引号和第一个等号之间的变量.

注意:带有"inside和next的字符串值&或者&&甚至||可以使用set "variable=value"错误解释,因此会导致意外行为,因为在运行批处理文件时可以看到以下两行:

@echo off
set "Variable=Value with one double quote in the middle" & echo Oh, there is something wrong here!"
Run Code Online (Sandbox Code Playgroud)

Value with one double quote in the middle" & echo Oh, there is something wrong here!是分配给环境变量的字符串,但是分配给变量只是Value with one double quote in the middle"中间的其余部分之后和之后被&解释为条件运算符而不是字面上被解释为执行的附加命令cmd.exe.使用0或更多空格/制表符时&&||之后存在同样的问题".此问题不是由命令引起的.它是由Windows命令处理器其将排队到命令行所引起和一个更加命令行与回波条件执行所述的回波命令行.

带有禁用命令扩展的变量赋值

set "variable=value"如果setlocal DisableExtensions在批处理文件中禁用了命令扩展名,则无法使用命令语法(或者在Windows注册表中这是非常罕见的,并且我在任何Windows计算机上都看不到).语法错误将是执行批处理文件时的结果.

只能在set variable=value禁用命令扩展名的情况下使用,其中值也可以包含双引号,并且必须小心尾随空格/制表符,因为它们也分配给环境变量.

在命令提示窗口运行cmd /?setlocal /?有关命令扩展和由命令扩展受到影响哪些命令的更多信息.注意:受影响的命令的输出列表未按照GOTO:EOF返回的位置的答案中所述退出

通过算术表达式的变量赋值

使用带有选项的命令/A完全改变第二个参数的解析,即后面的字符串set /A.使用option /A作为第一个参数,第二个字符串被解释为算术表达式,因此处理完全不同于将字符串值赋值给环境变量.环境变量总是字符串类型,永远不是整数类型.

选项的使用/A需要启用命令扩展,否则命令将完全忽略该行的其余部分,而不会显示任何错误消息.

在大多数情况下,建议不要仅使用算术表达式为环境变量赋值,即使用set /A var=1.set "var=1"或者只是set var=1(并且没有尾随空格)更快一点,因为环境变量总是字符串类型.

在算术表达式中,空格被解释为变量名,数字和运算符的分隔符.由于这个原因,命令行set /A var = 1 没有定义与名称的变量VARSpace与串Space1set var = 1一样.在从字符串(批处理文件包含具有十六进制代码值31的字符)转换为具有值的整数并且返回到具有两个值0x31和0x00(字符串终止为空)的字符串之后,set /A var = 1定义具有名称VAR且具有字符串值1的变量.111

通过提示进行变量赋值

也使用命令与选项/P改变字符串的变量名和等号后的解析.变量名称和等号后面的字符串被解释为要输出的提示文本,而不是作为要分配给环境变量的字符串.

环境变量被分配由提示用户输入的字符串(或从文件或命令/应用程序重定向),或者如果用户在按下之前没有输入任何内容,RETURN或者ENTER如果未在提示之前定义,则分别保持其当前值仍未定义.

选项的使用/P需要启用命令扩展,否则命令将完全忽略该行的其余部分,而不会显示任何错误消息.

用于提示用户输入字符串的最常用语法是:

set /P var="Please enter something: "
Run Code Online (Sandbox Code Playgroud)

该指令在这种情况下,打印处理之前将围绕自动提示文本双引号STDOUT(如果不是重定向控制台窗口).

但工作也是:

set /P "var=Please enter something: "
Run Code Online (Sandbox Code Playgroud)

请阅读此答案以获取有关提示文本解析以及如何使用周围双引号输出提示文本的更多详细信息.


小智 6

您需要从等号开始接近文本:

set var=text
echo %var%
text
Run Code Online (Sandbox Code Playgroud)

  • @Logern当你执行`set var = text`时,你实际上是在创建一个名为`var`的变量(注意r之后的空格). (2认同)