18

Process.Start(ProcessStartInfo); を使用して、C# からコマンド ライン アプリケーションを実行しようとしています。

問題は、コマンド ライン アプリケーションが matlab スタンドアロンの .exe であり、オプションの引数があることです。これは、コマンド ラインで次のように渡すことを意味します。

app.exe "optional1" optional1value "optional2" optional2value

optional1valueは整数または文字列などです。

私たちが抱えている問題は、二重引用符が「optional1」引数の一部として渡されていないため、cmd.exe は次のようになっていると思います。

app.exe optional1 optional1value optional2 optional2value

またはそのようなもので、matlabのパーサーが明らかに混乱します。

私が試してみました:

@"""optional1"" optional1value ""optional2" optional2value"""

cmd行引数の二重引用符に関する他のSOの質問でいくつかが示唆しているように、それは私にとってはうまくいかないようです。

"\"optional1\" optional1value \"optional2\" optional2value\""

取得した引数を出力する小さな c# コマンド ライン .exe を作成しました。コマンドライン引数を VS Project->Debug 領域に入れて実行すると、二重引用符で出力されますが、コードでこれを行うとすべてのエスケープなどが原因で、.exe は二重引用符なしで引数を出力します。

おそらく.NET 3.5のcmdパーサーのバグであるというこの記事を見つけましたが、実行可能な解決策が見つからないようです。

誰にもアイデアはありますか?

お時間をいただきありがとうございます。

ポンチョ

PS Process.Start() で引数を送信するときに cmd.exe が取得するものを確認する方法はありますか? プロセスで cmd ウィンドウを開いていますが、cmd.exe が "app.exe optional1 optional1value" などの行を取得するのを見るといいでしょう。

再度、感謝します。

4

1 に答える 1

20

の引用ProcessStartInfo.Arguments符は、3 つの引用符 ( ) としてエスケープする必要があります"""。これは、単一の引数としてスペースを含む文字列を渡すために単一引用符が使用されているためです。

こちらのドキュメントを参照してください。

var psi = new ProcessStartInfo(
    "cmd_app.exe",
    "\"\"\"optional1\"\"\" optional1value \"\"\"optional2\"\"\" optional2value");
Process.Start(psi);

cmd_app.exe が行うのは、引数の数と引数の内容を通知することだけで、次の入力が表示されます。

"optional1"
optional1value
"optional2"
optional2value
于 2013-01-15T14:49:24.980 に答える