4

パスが二重引用符で囲まれている場合でも、 Windows 8 のパスにスペースがあると、C# でプロセスを開始する際に問題が発生します。

次のコードは、XP および Windows 7 マシンで何年も正常に動作していましたが、最近、一部の開発ボックスを Windows 8 に切り替えたところ、次のエラーが発生しました。

'D:\Workspace\Visual' is not recognized as an internal or external command, operable program or batch file.

コード:

string command = "\"D:\\Workspace\\Visual Studio 2010\\Dev\\Tools\\Editors\\AssetManager\\bin\\Tools\\TextureAtlasBuilder.exe\"";
string arguments = "\"D:\\Local\\Temp\\xu2twc4d.cg1\" \"environment-textures\"";

ProcessStartInfo startInfo = new ProcessStartInfo
{
    CreateNoWindow = true,
    UseShellExecute = false,
    WindowStyle = ProcessWindowStyle.Hidden,
    RedirectStandardError = true,
    RedirectStandardOutput = true,
    FileName = string.Format(CultureInfo.InvariantCulture, @"{0}\cmd.exe", Environment.SystemDirectory),
    Arguments = string.Format(CultureInfo.InvariantCulture, "/C {0} {1}", command, arguments)
};

Process process = new Process
{
    StartInfo = startInfo
};

process.OutputDataReceived += new DataReceivedEventHandler(StandardOutputHandler);
process.ErrorDataReceived += new DataReceivedEventHandler(StandardErrorHandler);

process.Start();

二重引用符の有無にかかわらずリテラル文字列、二重引用符の有無にかかわらず逐語的な文字列を試しましたが、常に同じエラーが発生します!

私は何を間違っていますか?!

ありがとう

4

2 に答える 2

1

引数文字列から " を削除します。

/C を使用した cmd の動作は、cmd /? からわかるように、" の使用が非常に厳密であるため、注意が必要です。すべて失敗した場合: コマンドラインと引数を一時的な cmd ファイルに書き込み、それを開始します...

/C または /K が指定されている場合、スイッチの後のコマンド ラインの残りの部分はコマンド ラインとして処理されます。ここでは、引用符 (") 文字を処理するために次のロジックが使用されます。

1.  If all of the following conditions are met, then quote characters
    on the command line are preserved:

    - no /S switch
    - exactly two quote characters
    - no special characters between the two quote characters,
      where special is one of: &<>()@^|
    - there are one or more whitespace characters between the
      two quote characters
    - the string between the two quote characters is the name
      of an executable file.

2.  Otherwise, old behavior is to see if the first character is
    a quote character and if so, strip the leading character and
    remove the last quote character on the command line, preserving
    any text after the last quote character.
于 2012-12-29T14:47:33.760 に答える
0

次のパスを使用していますが、正常に受け入れています。

string command1 = @"C:\test\ab ab\1.txt";
Process.Start(command1);
于 2012-12-29T14:23:00.713 に答える