Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use Process.Start with parameters AND spaces in path

I've seen similar examples, but can't find something exactly like my problem.

I need to run a command like this from C#:

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

I'm setting v2 at runtime, so I need to be able to modify the string in C# before calling Process.Start. Does anyone know how to handle this, since I have spaces between my parameters?

like image 550
WEFX Avatar asked Jun 26 '13 13:06

WEFX


4 Answers

Even when you use the ProcessStartInfo Class, if you have to add spaces for arguments, then the above answers won't solve the problem. There's a simple solution. Just add quotes around arguments. That's all.

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

Here I've added escaped quotes around filename, and it works.

like image 54
Abdul Saleem Avatar answered Nov 19 '22 04:11

Abdul Saleem


You can use the ProcessStartInfo class to separate your arguments, FileName, WorkingDirectory and arguments without worry for spaces

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

where MakeParameter is a function that returns the string to be used for the p2 parameter

like image 23
Steve Avatar answered Nov 19 '22 03:11

Steve


Try this

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);
like image 10
Swapnil Avatar answered Nov 19 '22 04:11

Swapnil


After looking at the other solutions provided I ran into the issue where all my various arguments were bundled into one argument.

i.e. "-setting0=arg0 --subsetting0=arg1"

So I would propose the following:

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

With the quotes around each argument, instead of around the entire set of arguments. And as pointed out by Red_Shadow this can all be done with the single line

        Process.Start("\"" + filename + "\"", arguments here)
like image 5
Peet Avatar answered Nov 19 '22 04:11

Peet