Использовать Process.Start с параметрами и пробелами в пути

Я видел похожие примеры, но не могу найти что-то вроде моей проблемы.

Мне нужно запустить такую ​​команду из С#:

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

Я устанавливаю v2 во время выполнения, поэтому мне нужно иметь возможность изменять строку на С# перед вызовом Process.Start. Кто-нибудь знает, как справиться с этим, поскольку у меня есть пробелы между моими параметрами?

Ответы

Ответ 1

Вы можете использовать класс ProcessStartInfo для разделения ваших аргументов, FileName, WorkDirectory и аргументов, не беспокоясь о пробелах

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

Ответ 2

Даже если вы используете класс 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);

Здесь я добавил экранированные цитаты вокруг имени файла, и он работает.

Ответ 3

Попробуйте это

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);

Ответ 4

Посмотрев на другие предоставленные решения, я столкнулся с проблемой, когда все мои различные аргументы были объединены в один аргумент.

то есть. "-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, все это можно сделать с помощью одной строки

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