批处理文件和引用变量

时间:2016-03-03 18:47:38

标签: batch-file cmd

我正在使用批处理文件,我想知道,为什么有些变量在它们周围有双引号而其他变量没有,例如?

SET "keePass=%USERPROFILE%\KeePass\KeePass-2.31\KeePass.exe"

但是这个:

SET name="bob"

为什么第一个引用双引号,而不是第二个?

1 个答案:

答案 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"将扩展为"",这可能不是你想拥有的字符串);

但可能会出现两个问题:

  • 任何(不可见的)尾随空格成为字符串值的一部分,因此如果命令行后跟一个 SPACE 字符,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将此命令与另一个命令连接时,您必须省略&符号周围的空格;

现在,让我们看看你问题中第一个例子的语法:

""

这会将"分配给&。由于引号放在整个赋值表达式的周围,因此在实际完成赋值之前会删除它们。

这有几个好处:

  • 引号不会成为变量值的一部分;
  • 任何(非预期的)尾随空格不会成为变量值的一部分;
  • 您可以使用 SPACE set "VAR=value" SPACE 将其连接到另一个命令,而不会将任何不需要的空格附加到该值;
  • value中的特殊字符(例如VAR &等)没有问题;

但有一个问题:

  • 需要启用命令扩展才能使此语法生效;否则,会出现错误;

最后,你还可以结合上面的语法,如果你想让引号成为变量值的一部分(虽然我不建议这样做):

^

这会将&分配给value

优点:

  • 不需要的尾随空格(在最后set "VAR="value"" 之后)不会成为变量值的一部分;
  • 您可以使用 SPACE "value" SPACE 将其与另一个命令连接,而不会在值中包含任何不需要的尾随空格;

缺点:

  • 引号成为价值的一部分,在许多情况下可能令人不安;
  • 需要启用命令扩展才能使此语法生效;否则,会出现错误;
  • VAR中的特殊字符(如" &等)可能会导致问题;这是因为命令解析器的工作方式:遇到第一个^时,任何特殊字符都不再被识别,它们被视为文字字符;在下一个&之后,特殊字符识别将被重新激活,依此类推;认为value本身包含任何引号的情况也是如此;

旁注:

永远不要在"命令行中的等号前面加上空格,因为它们将成为变量名称和/或值的一部分。例如,命令行

"

value

将字符串值 SPACE set分配给名为set VAR = value SPACE 的变量。