当变量以反斜杠结尾时批量环境变量扩展?

当变量以反斜杠结尾时批量环境变量扩展?

我只是想问一下这是否是预期的行为,这确实让我感到惊讶。

我们有一个批处理文件,它将一些文件从其所在位置的子目录复制到每个开发人员机器上的另一个位置。由于对于某些开发人员来说,此目标目录与其他目录不同,因此我们设置了一个用户环境变量,并在批处理文件中使用了该变量。

这是批处理文件中的示例行:

ROBOCOPY Staging\*.* "%DISTRIBUTE_TARGET%" *.* /IS

这在一台机器上失败了,经过一些实验后,我意识到在这台机器上,变量的尾随反斜杠是变量内容的一部分。

在大多数机器上(事实上,在所有其他可以运行的机器上),该变量如下所示:

DISTRIBUTE_TARGET=C:\Some\Directory

但在这台机器上,它是:

DISTRIBUTE_TARGET=C:\Some\Directory\

注意那里添加的反斜杠。

ROBOCOPY 给出的错误信息是第二个参数有问题,但它似乎认为从该变量的开始到行尾的所有内容都在第二个参数中。

即错误消息如下所示:

Error in second parameter: "C:\Some\Directory\" *.* /IS"

我认为发生的情况是反斜杠“转义”了引号字符,从而删除了其作为“引用参数的结束”的含义,因此该行的其余部分仅被抓取作为参数的一部分。

这是预期的行为吗?这是否意味着无论出于何种原因或目的,带有尾随反斜杠的变量都无法安全使用?

答案1

由此文章

如果源或目标是“带引号的长文件夹名称”,请不要包含尾随反斜杠,因为这将被视为转义字符,即“C:\some path\”将失败,但“C:\some path\\”或“C:\some path”可以工作。

这是 robocopy 特有的问题。我甚至可以称之为 bug。

您没有其他解决方案,只能向批处理文件中添加代码,以检查并删除源和目标末尾的反斜杠。

答案2

事实上,这并不是 robocopy 独有的,而是命令行转ArgvWWindows API 函数。

当反斜杠字符后跟引号字符 (") 时,CommandLineToArgvW 对反斜杠字符有特殊解释,如下所示:

2n 个反斜杠后跟引号产生 n 个反斜杠后跟引号。

(2n) + 1 个反斜杠后跟引号,再次产生 n 个反斜杠后跟引号。

n 个反斜杠后面没有引号,则只产生 n 个反斜杠。

相同的规则在解析 C++ 命令行参数

解决方法是将.您知道的所有内容附加到目录中(例如"C:\Program Files\."

相关内容