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

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

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

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

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


person WEFX    schedule 26.06.2013    source источник
comment
ProcessStartInfo: msdn.microsoft.com/en-us/library/   -  person wgraham    schedule 26.06.2013
comment
Пробелы в пути, переданном в ProcessStartInfo.Filename или Process.Start(string, string), не являются проблемой. Это только программа, которая анализирует строку, которая может быть сбита с толку, например, cmd.exe.   -  person Hans Passant    schedule 26.06.2013
comment
@HansPassant vlc.exe также смущают пробелы в имени файла. Так что я должен воспользоваться советом Стива, чтобы заставить Procees.Start работать на меня.   -  person LetzerWille    schedule 16.04.2017


Ответы (4)


Вы можете использовать класс 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.

person Steve    schedule 26.06.2013

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

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

person Abdul Saleem    schedule 12.01.2015
comment
Это также можно сделать в одной строке с помощью Process.Start(Excel.exe, \ + имя_файла + \); - person Red_Shadow; 26.01.2016
comment
Да, но здесь я пытаюсь выделить добавление кавычек, чтобы не запутать новичков. - person Abdul Saleem; 14.12.2016

Попробуй это

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);
person Swapnil    schedule 26.06.2013
comment
Это было прекрасно, за исключением отсутствия метода startInfo.Start(). Мне пришлось использовать Process.Start(startInfo), как предложил @Steve. Спасибо за помощь. - person WEFX; 26.06.2013

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

i.e. "-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)
person Peet    schedule 05.07.2017