Batch file 批处理文件和引用变量
我正在处理一个批处理文件,我想知道,例如,为什么有些变量周围有双引号,而其他变量没有Batch file 批处理文件和引用变量,batch-file,cmd,Batch File,Cmd,我正在处理一个批处理文件,我想知道,例如,为什么有些变量周围有双引号,而其他变量没有 SET "keePass=%USERPROFILE%\KeePass\KeePass-2.31\KeePass.exe" 但这是: SET name="bob" 为什么第一个双引号,而不是第二个双引号?…在开始时提供结论: 假设已启用命令扩展(这是Windows命令提示符cmd的默认设置),最佳做法是使用以下set语法: set "VAR=value" (可以通过cmd(在命令提示窗口中键入cmd/?以获
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
这种语法的优点是:
- 当命令扩展被禁用时,它也可以工作李>
- 变量值没有引号包围(假设
值本身不包含引号),因此只有一个地方可以处理它们,即在变量扩展期间(如
或%VAR%
,具体取决于当前的情况;这在组合字符串时特别有用,如%VAR%”
或常量\uu%VAR%
,这些字符串将扩展为常量\u%VAR%
或常量\u值
,因此您始终可以完全控制引号的位置;如果值包含封闭的常量\u值
”,“
将扩展到常量值%VAR%
,这可能不是您想要的字符串)李>常量值“
- 任何(不可见)尾随空格都将成为字符串值的一部分,因此,如果命令行后跟单个空格字符,
将携带值VAR
空格李>value
- 将此命令与另一个命令(如
)连接时,set VAR=value&echo Text
字符前的空格将成为值的一部分;当然,您可以编写&
setvar=value&echo一些文本,但这很难阅读李>
- 如果
包含特殊字符,如值
^
&
(
)
,您可能会遇到问题;例如,
将set VAR=1&2
分配给1
,然后会出现错误,因为VAR
分隔了两个命令,&
不是有效的命令李>2
- 如果
问题中第二个示例的语法非常相似:
set VAR="value"
这将字符串“value”
分配给VAR
,因此引号包含在值中
优点是:
- 当命令扩展被禁用时,它也可以工作李>
中的特殊字符(如值
^
等)不会因为&
而引起任何问题李>“
- 引号成为价值的一部分,在许多情况下可能会令人不安李>
- 不需要的尾随空格(在最后一个
之后)仍然成为字符串值的一部分“
- 同样,当使用
将此命令与另一个命令连接时,必须省略符号和周围的空格&
现在,让我们检查一下问题中第一个示例的语法:
set "VAR=value"
这将value
赋值给VAR
。由于引号位于整个赋值表达式的周围,因此在实际完成赋值之前将其删除
这有几个好处:
- 引号不会成为变量值的一部分
- 任何(意外的)尾随空格不会成为变量值的一部分
- 您可以使用空格
空格将其与另一个命令连接起来,而无需将任何不需要的空格附加到该值&
中的特殊字符(如值
^
等)没有问题&
- 需要启用命令扩展才能使此语法正常工作;否则,将出现错误
最后,如果您确实希望引号成为变量值的一部分,还可以组合上述语法(尽管我不建议这样做): 这将
的“值”
分配给VAR
优点:
- 不需要的尾随空格(在最后一个
之后)不会成为变量值的一部分李>“
- 您可以使用空格
空格将其与另一个命令连接起来,而在值中没有任何不需要的尾随空格李>&
- 引号成为价值的一部分,在许多情况下可能会令人不安李>
- 需要启用命令扩展才能使用此语法;否则,会出现错误李>
值中的特殊字符(如
^
等)可能会导致问题;这是因为命令解析器的工作方式:一旦遇到第一个&
,任何特殊字符将不再被识别,它们将被视为文字字符;在下一个“
之后,特殊字符识别将重新激活,依此类推;如果”
本身包含任何引号,则认为这也是正确的李>值
旁注: 切勿在
set
命令行中的等号周围放置空格,因为它们将成为
set "VAR="value""
set VAR = value
set "VAR = value"