使用“C:\Program Files (x86)”时,我遇到了一个奇怪的问题,即位于该路径下方某处的程序。我用测试程序重现了这种行为。
int _tmain(int argc, _TCHAR* argv[])
{
wprintf(L"%d\n", argc);
for (int i = 0; i < argc; i++) {
wprintf(L"%s\n", argv[i]);
}
return 0;
}
该程序计算并返回所有命令行参数(包括用于标识程序的程序路径)。我把它命名为“HelloWorld.exe”,因为我很着急。
对于运行程序的三种可能方式,它给出了两种不同的结果,而我期望得到相同的结果。
当我从自己的目录运行 HelloWorld.exe 时,输出是
1
HelloWorld.exe
该输出是正确且符合预期的。
当我从另一个位置运行位于“P:\Test (x86)”中的 HelloWorld.exe 并使用引用的路径时,输出为
1
P:\Test (x86)\HelloWorld.exe
该输出也是正确和预期的。
但是,当我从另一个位置运行 HelloWorld.exe 并使用带有转义空格和括号的路径时,找到了程序(即路径正确),但输出错误:
2
P:\Test
(x86)\HelloWorld.exe
出于某种原因,逃逸的空间
P:\Test\^ ^(x86^)\HelloWorld.exe
出于某种原因,它变成了一个空格读取操作符,Windows 在将路径作为一个字符串读取以找到程序之后,在创建程序然后引用的数组之前决定它实际上是两个字符串。
此行为在 Windows XP (x86) 和 Windows Server 2008 R2 (x64) 中都会出现。我假设它存在于所有 (NT) 版本的 Windows 中。