2013-06-26 2 views
18

Я видел похожие примеры, но не могу найти что-то точно, как моя проблема.Использовать Process.Start с параметрами AND пробелами в пути

мне нужно выполнить команду, как это из C#:

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

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

+0

'ProcessStartInfo': http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx – wgraham

+2

пространства в пути, переданном ProcessStartInfo.Filename или Process.Start (строка, строка), не проблема. Это только программа, которая анализирует строку, которая может смутить ее, например cmd.exe –

+0

@HansPassant vlc.exe также путается пробелами в имени файла. Поэтому я должен использовать совет Стива, чтобы сделать Procees.Start работать для меня. – LetzerWille

ответ

17

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

4

Попробуйте

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

Это было прекрасно, кроме метода startInfo.Start(). Мне пришлось использовать Process.Start (startInfo), например, @Steve. Спасибо за помощь. – WEFX

14

Даже если вы используете класс ProcessStartInfo, если вам нужно добавить пробелы для аргументов, тогда abo ответы не решают проблему. Есть простое решение. Просто добавьте цитаты вокруг аргументов. Это все.

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

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

+0

Это также можно сделать в одной строке с помощью Process.Start ("Excel.exe", "\" "+ fileName +" \ ""); –

+3

Да, но здесь я пытаюсь подчеркнуть добавление цитат, чтобы избежать путаницы для новичков – Sayka

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 все это может быть сделано с одной линией

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