在使用“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中。