ChatGPT解决这个技术问题 Extra ChatGPT

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

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

@echo off

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

我得到的输出如下:

We're working with ""

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


B
Brian Nixon

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


如果 = 之前的空格被解释为名称的一部分,那么变量 不能 被引用为 %location%,它必须被引用为 %location %。那是错字吗?
@悲惨变量:你是对的;似乎原始答案成为错误编辑的牺牲品。
所以这就是MS带来的
@Falaque 与 *nix 领域的 alias x = y 不同?
@Falaque 那么您认为 bash 在运行 x = y 时会做什么?
d
dbenham

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

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

set location="bob"

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

set location=bob

或者更好

set "location=bob"

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


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

输入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"。但即便如此,它也不再符合问题
s
surfmuggle

还可以考虑使用 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)设置环境变量:

选项1}

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