【问题标题】:Defining and using a variable in batch file在批处理文件中定义和使用变量
【发布时间】:2012-05-20 03:15:49
【问题描述】:

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

@echo off

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

我得到的输出如下:

We're working with ""

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

【问题讨论】:

    标签: batch-file cmd environment-variables


    【解决方案1】:

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

    【讨论】:

    • 如果= 之前的空格被解释为名称的一部分,那么变量不能 被引用为%location%,它必须被引用为%location %。是不是打错字了?
    • @Miserable 变量:你是对的;原来的答案似乎是错误编辑的牺牲品。
    • 这就是 MS 自带的
    • @Falaque 与 *nix 领域的 alias x = y 不同?
    • @Falaque 那么你认为 bash 在运行 x = y 时会做什么?
    【解决方案2】:

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

    如果你想在你的值中加上引号,那么你的代码应该是这样的

    set location="bob"
    

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

    set location=bob
    

    或者更好

    set "location=bob"
    

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

    【讨论】:

    • 最后一个语法有什么缺点吗?
    • @Wolf - 不,没有缺点。但是,它最有效的时间是有限度的。只要值不包含引号,那么几乎任何字符都可以出现在值中,而不必担心转义。例外是%,如果启用了延迟扩展,则可能是!。但是如果值确实包含引号,那么您必须担心何时转义|& 等有毒字符。
    • 这似乎与在 windows 中设置环境变量相同。这是在批处理脚本中使用局部变量的唯一方法吗?
    • @Wolf,您只需要确保command extensions 已启用,但无论如何这是默认配置...
    【解决方案3】:

    输入location.bat

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

    输出

    We're working with bob
    

    (你犯的错误:space" "

    【讨论】:

    • set /p 提示用户并将答案存储在指定的变量中。例如,set /p name="What is your name? " & echo Hello, %name%.
    • -1,语法set /p "varname"="text" 错误,它创建了一个名为location" 的变量(带有尾随引号!)。应该是set /p location="bob"。但即便如此,它也不再符合问题
    【解决方案4】:

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

    ::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% 这样的变量。

    【讨论】:

      猜你喜欢
      • 2014-01-08
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      相关资源
      最近更新 更多