为什么在命令行上使用'set var = text'后没有输出string'echo%var%'?
我使用set
命令在Windows 8.1上的CMD中设置了一个variables,并试图回显它。
这里是一个例子:
C:\Users\Logan>set var = text C:\Users\Logan>set var var = text C:\Users\Logan>echo %var% %var% C:\Users\Logan>
那么有没有办法强制命令提示符回显variables,而不是原始文本?
你需要使用等号代替文本:
set var=text echo %var% text
将值/string分配给环境variables
在默认情况下启用命令扩展最好的是使用:
set "var=text"
该命令被设置并且参数是"variable=value"
。
只要默认启用了命令扩展,参数string可以像所有命令一样用双引号引起来。
如果在引用variable=value
不使用双引号,那么命令集会将所有的行都解释为在行末尾包含不可见空格和水平制表符的第一个等号之后的所有行,作为要分配给variables的string值。
variables的名称以第一个非空白字符开始(在使用双引号后)并且结束于第一个等号。 分配给variables的值从第一个等号开始,到行结尾或最后一个双引号结束。
set VAR = TEXT
创build一个名为VAR Space的环境variables,并将stringSpace TEXT分配给该variables。
也使用
set var="text"
通常是不正确的,因为这会导致将variablesvar
分配给包含引号的文本以及所有尾随的空格和制表符。 现在引用另一个代码行中带有外围引号的variables通常会导致错误消息,因为variables将自身保存为已经带有引号的文本。 有关更多详细信息,请参阅如何使用空格设置环境variables的答案?
例:
@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
运行这个小的批处理代码产生输出:
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=""
这行定义variablesQuote
的值为"
。命令集将第一个等号后面的所有内容解释为最后一个双引号,作为赋值给第一个引号和第一个等号之间名称的variables的值。
带有禁用命令扩展的variables赋值
如果命令扩展在batch file中(或者在Windowsregistry中非常罕见,在任何Windows计算机上从来没有见过)中的setlocal DisableExtensions
禁用,则不能使用命令语法set "variable=value"
。 语法错误是batch file执行的结果。
只有在禁用了命令扩展的情况下才可以使用set variable=value
,因此该值也可以包含双引号,并且必须谨慎处理尾随空格/制表符,因为它们也被分配给环境variables。
在命令提示符窗口中运行cmd /?
和setlocal /?
有关命令扩展的更多信息以及哪些命令受命令扩展的影响。 注意:受影响的命令的输出列表未命中, 如GOTO:EOF返回的答案中所述。
通过算术expression式的variables赋值
使用带有选项/A
命令集完全改变了第二个参数的parsing,即set /A
之后的string。 使用选项/A
作为第一个参数,第二个string被解释为算术expression式 ,因此与向环境variables分配string值完全不同。 环境variables始终是stringtypes,永远不是整型。
选项/A
的使用需要启用命令扩展,否则命令集会忽略该行的其余部分,而不会出现任何错误消息。
在大多数情况下,不build议仅使用算术expression式为环境variables赋值,即使用set /A var=1
。 set "var=1"
或者只是set var=1
(并且没有尾随空格)稍快一点,因为环境variables总是stringtypes。
在算术expression式中,空格被解释为variables名,数字和运算符的分隔符。 因此,命令行set /A var = 1
没有定义名称为VAR Space的variables,其中string空间 1被set var = 1
。 set /A var = 1
从string(batch file包含1
作为字符,hex代码值为31)转换为值为1
整数并返回到具有两个值0x31的string后,定义名称为VAR ,string值为1的variables0x00(string终止空)。
通过提示variables赋值
同样使用命令集选项/P
改变string在variables名和等号后的parsing。 variables名和等号后面的string被解释为提示文本输出,而不是作为string分配给环境variables。
环境variables被赋予由提示用户input的string(或从文件或命令/应用程序redirect),或者如果用户在按下RETURN或ENTER之前没有input任何内容,则分别保持其当前值,如果未定义提示。
选项/P
的使用需要启用命令扩展,否则命令集会忽略该行的其余部分,而没有任何错误消息。
用于提示用户inputstring的大多数语法是:
set /P var="Please enter something: "
在这种情况下,命令集会自动删除提示文本前面的双引号,以便处理STDOUT (如果未redirect,则为控制台窗口)。
但工作也是:
set /P "var=Please enter something: "
请阅读此答案以获取有关提示文本parsing的更多详细信息,以及如何用周围的双引号输出提示文本。