我正在使用批处理文件,我想知道,为什么有些变量在它们周围有双引号而其他变量没有,例如?
SET "keePass=%USERPROFILE%\KeePass\KeePass-2.31\KeePass.exe"
但是这个:
SET name="bob"
为什么第一个引用双引号,而不是第二个?
答案 0 :(得分:1)
......在开头提供结论:
假设您已启用命令扩展(这是Windows命令提示符cmd
的默认设置),最佳做法是使用以下set
语法:
set "VAR=value"
(可以通过cmd
启用/禁用命令扩展(在命令提示符窗口中键入cmd /?
以获取帮助),或者仅在批处理文件中按setlocal
启用/禁用命令扩展(类型{{ 1}}了解详情)。)
首先,让我们看一下在命令提示符窗口中键入setlocal /?
(或set /?
)时出现的帮助文本中提到的标准语法:
help set
这显然会将字符串set VAR=value
分配给变量value
。
这种语法的好处是:
VAR
本身不包含它),因此只有一个地方可以处理它们,即在变量扩展期间(如value
}或%VAR%
,具体取决于当前的情况;这在合并"%VAR%"
或constant_%VAR%
等字符串时特别有用,这些字符串将扩展为"constant_%VAR%"
或{{1}因此,您始终可以完全控制引号的位置;如果值包含封闭的constant_value
,"constant_value"
将扩展为""
,这可能不是你想拥有的字符串); 但可能会出现两个问题:
constant_%VAR%
将带有值{{1 }} SPACE ; constant_"value"
字符成为值的一部分之前,将此命令与另一个命令(如VAR
), SPACE 连接在一起时;你当然可以写value
,但这很难读; set VAR=value & echo Text
包含特殊字符,例如&
set VAR=value&echo Some text
value
^
&
(
)
,你可能遇到问题;例如,<
会将>
分配给|
,然后会出现错误,因为set VAR=1&2
会分隔两个命令而1
不是有效命令; < / LI>
您问题中第二个示例的语法非常相似:
VAR
这会将字符串&
分配给2
,因此引号会包含在值中。
优点是:
set VAR="value"
中的特殊字符(例如"value"
VAR
等)不会因^
; 但仍然:
&
之后)仍然成为字符串值的一部分; value
将此命令与另一个命令连接时,您必须省略&符号周围的空格; 现在,让我们看看你问题中第一个例子的语法:
""
这会将"
分配给&
。由于引号放在整个赋值表达式的周围,因此在实际完成赋值之前会删除它们。
这有几个好处:
set "VAR=value"
SPACE 将其连接到另一个命令,而不会将任何不需要的空格附加到该值; value
中的特殊字符(例如VAR
&
等)没有问题; 但有一个问题:
最后,你还可以结合上面的语法,如果你想让引号成为变量值的一部分(虽然我不建议这样做):
^
这会将&
分配给value
。
优点:
set "VAR="value""
之后)不会成为变量值的一部分; "value"
SPACE 将其与另一个命令连接,而不会在值中包含任何不需要的尾随空格; 缺点:
VAR
中的特殊字符(如"
&
等)可能会导致问题;这是因为命令解析器的工作方式:遇到第一个^
时,任何特殊字符都不再被识别,它们被视为文字字符;在下一个&
之后,特殊字符识别将被重新激活,依此类推;认为value
本身包含任何引号的情况也是如此; 永远不要在"
命令行中的等号前面加上空格,因为它们将成为变量名称和/或值的一部分。例如,命令行
"
和
value
将字符串值 SPACE set
分配给名为set VAR = value
SPACE 的变量。