我正在使用批处理文件,有些变量周围有双引号,而有些则没有,比如为什么会这样?
SET "keePass=%USERPROFILE%\KeePass\KeePass-2.31\KeePass.exe"
但是这个:
SET name="bob"
为什么第一个有双引号,但第二个没有?
我正在使用批处理文件,有些变量周围有双引号,而有些则没有,比如为什么会这样?
SET "keePass=%USERPROFILE%\KeePass\KeePass-2.31\KeePass.exe"
SET name="bob"
首先,假设您已启用了命令扩展(这是Windows命令提示符cmd
的默认设置),最佳实践是使用以下set
语法:
set "VAR=value"
cmd
启用/禁用(在命令提示符窗口中键入cmd /?
以获取帮助),或仅在批处理文件中,通过setlocal
启用/禁用(键入setlocal /?
以获取详细信息)。)
set /?
(或help set
)时出现的帮助文本中提到的标准语法:set VAR=value
value
赋值给变量VAR
。value
本身不包含引号),因此只有一个地方需要注意它们,即在变量扩展期间(如%VAR%
或"%VAR%"
,取决于具体情况;当组合字符串时特别有用,如constant_%VAR%
或"constant_%VAR%"
,它们将分别扩展为constant_value
或"constant_value"
,因此您始终对引号的放置有完全控制;如果值包含封闭的""
,constant_%VAR%
将扩展为constant_"value"
,这可能不是您想要的字符串);VAR
将携带值value
SPACE;set VAR=value & echo Text
,则&
字符前的SPACE将成为值的一部分;当然,您可以编写set VAR=value&echo Some text
,但这很难阅读;value
包含特殊字符,如^
&
(
)
<
>
|
,则可能会遇到问题;例如,set VAR=1&2
将向VAR
分配1
,然后会出现错误,因为&
分隔两个命令,而2
不是有效命令;set VAR="value"
"value"
分配给VAR
,因此引号包含在值中。""
,所以value
中的特殊字符(如^
&
等)不会造成任何问题;"
后面的不必要的尾随空格仍然成为字符串值的一部分;&
连接此命令与另一个命令时,必须省略和&之间的空格;set "VAR=value"
这会将value
赋给VAR
。由于引号放在赋值表达式的整个周围,因此它们在实际完成赋值之前被删除。
这有几个优点:
&
SPACE将其与另一个命令连接起来,而不会附加任何不需要的空格到值中;^
&
等)不是问题;但是有一个问题:
最后,如果确实希望引号成为变量值的一部分(尽管我不建议这样做),也可以组合上述语法:
set "VAR="value""
这将"value"
赋值给VAR
。
优点:
"
之后)不会成为变量值的一部分;&
SPACE将其与另一个命令连接,而不会在值中产生任何不需要的尾随空格;缺点:
value
中的特殊字符(如^
&
等)可能会导致问题;这是因为命令解析器的工作方式:一旦遇到第一个"
,任何特殊字符都不再被识别,它们被视为文字字符;在下一个"
之后,特殊字符识别重新激活,以此类推;请注意,在value
本身包含任何引号时,这也是正确的;在set
命令行中不要在等号周围放置空格,因为它们将成为变量名称和/或值的一部分。例如,命令行
set VAR = value
并且
set "VAR = value"
两者都将字符串值SPACEvalue
分配给名为VAR
SPACE的变量。
"
表示值已结束),而且可以与其他命令内联使用(例如,set "var=value" & echo some text
),而不会在末尾产生不必要的空格... 我总是使用这种语法,这样您始终可以在扩展期间(像%var%
或"%var%"
,具体取决于用法)关注引号的位置... - aschipflif "%var%"=="value"
或if "%var1%"=="%var2%"
)时,如果其中一个变量可能为空,则在变量和值两侧加上双引号是很有用的。此外,当变量被设置为路径和文件名时,为避免空格问题,它们应始终被双引号包围引用(例如copy "%aFile%" "%aPath%"
)。 - Wes Larson