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

Las*_*sen 3 windows-vista command-line environment-variables

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

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

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

ROBOCOPY Staging\*.* "%DISTRIBUTE_TARGET%" *.* /IS
Run Code Online (Sandbox Code Playgroud)

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

在大多数机器上(事实上,在它工作的所有其他机器上),变量看起来像这样:

DISTRIBUTE_TARGET=C:\Some\Directory
Run Code Online (Sandbox Code Playgroud)

但在这台机器上,它是:

DISTRIBUTE_TARGET=C:\Some\Directory\
Run Code Online (Sandbox Code Playgroud)

请注意那里添加的反斜杠。

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

IE。错误消息如下所示:

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

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

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

Kev*_*yth 5

事实上,这并不是 robocopy 特有的,而是CommandLineToArgvW Windows API 函数特有的。

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

2n 个反斜杠后跟一个引号会生成 n 个反斜杠后跟一个引号。

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

n 个反斜杠后面不跟引号只会产生 n 个反斜杠。

解析 C++ 命令行参数中描述了相同的规则

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