在批处理文件中定义和使用变量


450

我正在尝试在批处理文件中定义和使用变量。看起来应该很简单:

@echo off

set location = "bob"
echo We're working with "%location%"

我得到的输出如下:

We're working with ""

这里发生了什么?为什么我的变量没有被回显?

Answers:


551

之前的空格=被解释为名称的一部分,其之后的空格(以及引号)被解释为值的一部分。因此,您创建的变量可以用引用%location %。如果这不是您想要的,请删除定义中的多余空间。


7
如果前面的空格=被解释为名称的一部分,那么该变量不能被引用为%location%,则必须被引用为%location %。那是错字吗?
可悲的变量2013年

7
@Miserable变量:您是对的;原来的答案似乎是错误编辑的受害者。
布莱恩·尼克松

18
因此,这是MS来了
Falaque

5
@Falaque相对于alias x = y* nix土地?
2016年

1
@Falaque那么,您认为bash在运行时会做什么x = y
phuclv

263

空间很大。您创建了一个名为变量'location ' 具有的价值
' "bob"'注意-添加了单引号以显示空间位置。

如果要在值中加上引号,则代码应如下所示

set location="bob"

如果您不想使用引号,那么您的代码应如下所示

set location=bob

还是更好

set "location=bob"

最后一种语法可以防止无意的尾随空格进入值,还可以防止诸如& |等的特殊字符。


8
最后一种语法有什么缺点吗?

8
@狼-不,没有缺点。但是,何时才是最有效的有一个限制。只要该值不包含引号,那么几乎所有字符都可以出现在该值中,而不必担心转义。除外%,并且可能!启用了延迟扩展。但是,如果此值不包含引号,则必须发愁的时候逃跑毒药字符,如|&
dbenham

1
这似乎与在Windows中设置环境变量相同。这是在批处理脚本中使用局部变量的唯一方法吗?
parasrish

1
@Wolf,您只需要确保启用了命令扩展名,但这仍然是默认配置...
aschipfl

7

输入 location.bat

@echo off
cls

set /p "location"="bob"
echo We're working with %location%
pause

输出

We're working with bob

(您做错了:space" "


4
set /p提示用户并将答案存储在指定的变量中。例如set /p name="What is your name? " & echo Hello, %name%.
罗伯特·穆尼 Robert Mooney)'18年

6
-1,语法set /p "varname"="text"错误,它将创建一个名为的变量location"(带引号!)。应该是set /p location="bob"。但即使如此,它也不再符合这个问题了
jeb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.