web-dev-qa-db-ja.com

パスにパラメーターとスペースを指定してProcess.Startを使用する

私は同様の例を見てきましたが、私の問題とまったく同じようなものを見つけることができません。

C#から次のようなコマンドを実行する必要があります。

C:\FOLDER\folder with spaces\OTHER_FOLDER\executable.exe p1=hardCodedv1 p2=v2

実行時にv2を設定しているため、Process.Startを呼び出す前にC#で文字列を変更できる必要があります。パラメータ間にスペースがあるので、これを処理する方法を知っていますか?

29
WEFX

ProcessStartInfo クラスを使用して、スペースを心配せずに引数、FileName、WorkingDirectory、および引数を分離できます。

string fullPath = @"C:\FOLDER\folder with spaces\OTHER_FOLDER\executable.exe"
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = Path.GetFileName(fullPath);
psi.WorkingDirectory = Path.GetDirectoryName(fullPath);
psi.Arguments = "p1=hardCodedv1 p2=" + MakeParameter();
Process.Start(psi);

makeParameterは、p2パラメーターに使用される文字列を返す関数です

20
Steve

ProcessStartInfoクラスを使用する場合でも、引数にスペースを追加する必要がある場合、上記の回答では問題は解決しません。簡単な解決策があります。引数を引用符で囲むだけです。それで全部です。

 string fileName = @"D:\Company Accounts\Auditing Sep-2014 Reports.xlsx";
 System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
 startInfo.FileName = "Excel.exe";
 startInfo.Arguments = "\"" + fileName + "\"";
 System.Diagnostics.Process.Start(startInfo);

ここで、ファイル名の周りにエスケープされた引用符を追加しましたが、動作します。

23
Sayka

これを試して

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName =  "\"C:\\FOLDER\\folder with   spaces\\OTHER_FOLDER\\executable.exe\"";
startInfo.Arguments = "p1=hardCodedv1 p2=v2";
Process.Start(startInfo);
6
Swapnil

提供されている他のソリューションを見て、さまざまな引数がすべて1つの引数にまとめられている問題に遭遇しました。

つまり"-setting0=arg0 --subsetting0=arg1"

だから私は以下を提案します:

        ProcessStartInfo psi = new ProcessStartInfo();
        psi.FileName = "\"" + Prefs.CaptureLocation.FullName + "\"";
        psi.Arguments = String.Format("-setting0={0} --subsetting0={1}", "\"" + arg0 + "\"", "\"" + arg1+ "\"");
        Process.Start(psi);

引数のセット全体ではなく、各引数を引用符で囲みます。 Red_Shadow で指摘されているように、これはすべて1行で実行できます。

        Process.Start("\"" + filename + "\"", arguments here)
2
Peet