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

Jam*_*xon 427 cmd batch-file environment-variables

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

@echo off

set location = "bob"
echo We're working with "%location%"
Run Code Online (Sandbox Code Playgroud)

我得到的输出如下:

We're working with ""
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*xon 535

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

  • 所以这就是MS的用武之地 (15认同)
  • 如果`=`之前的空格被解释为名称的一部分,那么变量*不能被引用为`%location%`,它必须被引用为`%location%`.那是一个错字吗? (7认同)
  • @Mimrable变量:你是对的; 似乎原始答案成为不正确编辑的受害者. (7认同)
  • @Falaque与*nix land中的'alias x = y`相反? (5认同)
  • @Falaque 那么你认为 bash 在运行 `x = y` 时会做什么? (3认同)

dbe*_*ham 255

空间很重要.您创建了一个名为(包含添加的单引号以显示空间位置)'location ' 的变量,其值为' "bob"'.

如果你想要价值的报价,那么你的代码应该是这样的

set location="bob"
Run Code Online (Sandbox Code Playgroud)

如果您不想要引号,那么您的代码应该是这样的

set location=bob
Run Code Online (Sandbox Code Playgroud)

或者更好

set "location=bob"
Run Code Online (Sandbox Code Playgroud)

最后一种语法可以防止无意中的空格进入值,还可以防止像&|这样的特殊字符 等等

  • 最后一种语法有任何缺点吗? (7认同)
  • @Wolf - 不,没有缺点.但是,最有效的时间是有限的.只要该值不包含引号,那么几乎任何字符都可以出现在值中而不必担心转义.例外是`%`,如果启用了延迟扩展,则可能是`!`.但是如果值确实包含引号,那么你必须担心何时逃避毒性字符,如`|`,`&`等. (7认同)

npo*_*aka 6

还考虑使用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
)
Run Code Online (Sandbox Code Playgroud)

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

用户变量: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)
Run Code Online (Sandbox Code Playgroud)

另一个例子

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

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


小智 5

输入 location.bat

@echo off
cls

set /p "location"="bob"
echo We're working with %location%
pause
Run Code Online (Sandbox Code Playgroud)

产量

We're working with bob
Run Code Online (Sandbox Code Playgroud)

(你做错了:space" ")

  • `set/p`提示用户并将答案存储在指定的变量中.例如,`set/p name ="你的名字是什么?"&echo Hello,%name%.` (4认同)
  • -1,语法`set / p“ varname” =“文本”`是错误的,它创建了一个名为`location“`的变量(带引号!),应为`set / p location =” bob“`。但是,即使如此,它也不再符合问题 (4认同)