Batch file 为什么不使用';回声%var%和#x27;使用';设置var=text';cmd中的命令?

Batch file 为什么不使用';回声%var%和#x27;使用';设置var=text';cmd中的命令?,batch-file,cmd,environment-variables,Batch File,Cmd,Environment Variables,我用set命令在cmd中设置了一个变量,并尝试echo它 以下是一个例子: C:\Users\Logan>set var=text C:\Users\Logan>设置变量 var=文本 C:\Users\Logan>echo%var% %var% C:\Users\Logan> 是否有办法强制cmd将变量而不是原始文本回送到上?您需要将文本从相等符号处拉近: set var=text echo %var% text 将值/字符串指定给环境变量 最好在启用命令扩展的情况下使用以下语法来定义或修

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

以下是一个例子:

C:\Users\Logan>set var=text
C:\Users\Logan>设置变量
var=文本
C:\Users\Logan>echo%var%
%var%
C:\Users\Logan>

是否有办法强制cmd将变量而不是原始文本回送到
上?

您需要将文本从相等符号处拉近:

set var=text
echo %var%
text
将值/字符串指定给环境变量 最好在启用命令扩展的情况下使用以下语法来定义或修改环境变量:

set "var=text"
命令为set,参数为
“变量=值”

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

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

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

set VAR = TEXT
上面的命令行创建一个名为VAR空格的环境变量,并将字符串空格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
此行使用值定义变量
Quote
。命令set将第一个等号左至最后一个双引号后的所有内容解释为要分配给名称介于第一个引号和第一个等号之间的变量的值

注意:
&
&
&
|
内部和下一个
的字符串值甚至在使用
设置“变量=值”
时可能会被误解,从而导致意外行为,因为在运行具有以下两行的批处理文件时可以看到:

@echo off
set "Variable=Value with one double quote in the middle" & echo Oh, there is something wrong here!"
中间有一个双引号的值”&echo哦,这里有点问题!
是要分配给环境变量的字符串,但分配给变量的只是
中间有一个双引号的值和
后面的其余行在/>代码>中间,在代码> >代码>之后解释为条件运算符,而不是逐字地解释为由代码> CMD.exe < /代码>执行的附加命令。同样的问题也存在于
&&
| |
后面的
之间有0个或更多空格/制表符。此问题不是由命令set引起的。这是由Windows命令处理器造成的,该处理器将该行拆分为一个带有set的命令行,以及一个带有echo的命令行,带有echo的命令行

禁用命令扩展名的变量赋值 如果在批处理文件中(或在Windows注册表中)使用
setlocal DisableExtensions
禁用命令扩展名,则无法使用命令语法
set“variable=value”
。执行批处理文件时会出现语法错误

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

在命令提示符窗口中运行
cmd/?
setlocal/?
,了解有关命令扩展以及哪些命令受命令扩展影响的更多信息。注意:受影响命令的输出列表未命中退出,如上的回答中所述

通过算术表达式进行变量赋值 将命令set与选项
/A
一起使用,可以完全更改第二个参数的解析,即
set/A
之后的字符串。使用选项
/A
作为第一个参数,第二个字符串被解释为算术表达式,因此处理过程与将字符串值分配给环境变量完全不同。环境变量始终为string类型,而从不为integer类型

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

在大多数情况下,不建议仅使用算术表达式为环境变量赋值,即使用
set/a var=1
<代码>设置“var=1”
或只是
设置var=1
(并且没有尾随空格)会快一点,因为环境变量总是字符串类型

在算术表达式中,空格被解释为变量名、数字和运算符的分隔符。因此,命令行
set/A var=1
没有像
set var=1
那样定义一个名为var的变量和字符串空间1
set/A var=1
从字符串转换
1
后,定义一个名为var且字符串值为1的变量(批处理文件将
1
作为十六进制代码val的字符)
set "Quote=""
@echo off
set "Variable=Value with one double quote in the middle" & echo Oh, there is something wrong here!"
set /P var="Please enter something: "
set /P "var=Please enter something: "