我正在尝试在批处理文件中定义和使用变量。看起来应该很简单:
@echo off
set location = "bob"
echo We're working with "%location%"
我得到的输出如下:
We're working with ""
这里发生了什么?为什么我的变量没有被回显?
=
之前的空格被解释为名称的一部分,它之后的空格(以及引号)被解释为值的一部分。因此,您创建的变量可以用 %location %
引用。如果这不是您想要的,请删除定义中的额外空格。
空间很重要。您创建了一个名为 'location '
的变量,其值为
' "bob"'
。 注意 - 添加了单引号以显示空间的位置。
如果你想在你的值中加上引号,那么你的代码应该看起来像
set location="bob"
如果你不想要引号,那么你的代码应该看起来像
set location=bob
或者更好
set "location=bob"
最后一种语法可以防止无意的尾随空格进入值,还可以防止像 &
|
等特殊字符。
%
,如果启用了延迟扩展,则可能是 !
。但是如果值确实包含引号,那么您必须担心何时转义像 |
、&
等有毒字符。
输入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%.
set /p "varname"="text"
错误,它创建了一个名为 location"
的变量(带有尾随引号!)。它应该是 set /p location="bob"
。但即便如此,它也不再符合问题
还可以考虑使用 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%
这样的变量。
=
之前的空格被解释为名称的一部分,那么变量 不能 被引用为%location%
,它必须被引用为%location %
。那是错字吗?alias x = y
不同?x = y
时会做什么?