「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」と名付けました。
プログラムを実行する 3 つの方法で、2 つの異なる結果が得られますが、私は同じ結果を期待していました。
独自のディレクトリから 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
何らかの理由でスペース読み取り演算子になり、プログラムを見つけるためにパスを1つの文字列として読み取った後、プログラムが参照する配列を作成する前に、実際には2つの文字列であると判断します.
この動作は、Windows XP (x86) と Windows Server 2008 R2 (x64) の両方で発生します。Windowsのすべての(NT)バージョンに存在すると思います。