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"