531

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

@echo off

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

我得到的输出如下:

We're working with ""

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

4

4 回答 4

652

前面的空格=被解释为名称的一部分,它后面的空格(以及引号)被解释为值的一部分。所以你创建的变量可以用%location %. 如果这不是您想要的,请删除定义中的额外空格。

于 2012-05-11T14:03:17.950 回答
298

空间很重要。您创建了一个名为的变量'location ' ,其值为
' "bob"'注意 - 添加了封闭的单引号以显示空间的位置。

如果你想在你的值中加上引号,那么你的代码应该看起来像

set location="bob"

如果你不想要引号,那么你的代码应该看起来像

set location=bob

或者更好

set "location=bob"

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

于 2012-05-11T14:04:12.613 回答
8

输入location.bat

@echo off
cls

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

输出

We're working with bob

(你犯的错误:space" "

于 2017-08-15T20:53:21.067 回答
4

还考虑使用SETX- 它将在用户或机器(所有用户可用)级别上设置变量,尽管该变量将在下次打开 cmd.exe 时可用,因此它通常可以与SET

::setting variable for the current user
if not defined My_Var (
  set "My_Var=My_Value"
  setx My_Var My_Value
)

::setting machine defined variable
if not defined Global_Var (
  set "Global_Var=Global_Value"
  SetX Global_Var Global_Value /m
)

您还可以直接编辑注册表值:

用户变量:HKEY_CURRENT_USER\Environment

系统变量:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

这将允许避免 SET 和 SETX 的一些限制,例如=名称中包含的变量。

第三方编辑

SETX.exe 永久设置环境变量,

SETX 可用于为机器 (HKLM) 或当前登录的用户 (HKCU) 设置环境变量:

选项/m

 /m
       Set the variable in the system environment HKLM.
       (The default is the local environment HKCU)

另一个例子

::setting variable for the current user
if not defined JAVAJDK (
  set "JAVAJDK=C:\Program Files\Java\jdk-13\bin"
  setx JAVAJDK "C:\Program Files\Java\jdk-13\bin"
)

在 command.exe 中,您可以像这样使用变量cd %JAVAJDK%

于 2020-11-09T17:15:30.210 回答