17
votes

I'm trying to run a cmd line application from c# using Process.Start(ProcessStartInfo);

The problem is, the cmd line application is a matlab standalone .exe and has optional arguments meaning that you pass them on the cmd line as such:

app.exe "optional1" optional1value "optional2" optional2value

Where optional1value is a integer or string etc.

The problem we're having is that the double quotes aren't being passed as part of the "optional1" argument and so I believe cmd.exe is getting something like:

app.exe optional1 optional1value optional2 optional2value

or something like that, which matlab's parser obviously gets confused by.

I have tried:

@"""optional1"" optional1value ""optional2" optional2value"""

as suggested by some in other SO questions regarding double quotes in cmd line arguments but it doesn't seem to be working for me, nor does:

"\"optional1\" optional1value \"optional2\" optional2value\""

I have written a small c# command line .exe to print out the arguments it gets. If I put the command line arguments in VS Project->Debug area and run it then it prints them with double quotes but because of all the escaping etc. when I do this in code, the .exe prints the arguments without any double quotes.

I found this article about it maybe being a bug in .NET 3.5's cmd parser but can't seem to find a viable solution.

Does anyone have any ideas?

Thank you for your time,

Poncho

P.S. Is there a way to see what cmd.exe gets when sending arguments over with Process.Start()? I have my Process opening a cmd window but it would be nice to see the line cmd.exe gets such as: "app.exe optional1 optional1value" etc.

Thanks again.

1
Can you post the code snippet where you declare the process object and call the start method? - Dhawalk
Why the extra quotes after optional2value? I think your quotes will be unbalanced in the result. - Henk Holterman
As a workaround: Could you add the quotes in the c# program? As a solution, perhaps upgrading to .NET 4.0 ? As another workaround: Make all values mandatory and use a fixed order of input arguments? - Dennis Jaheruddin
If you run a program directly doesn't it change the titlebar of the cmd window to the full path and arguments of whatever you're invoking? - ldam
@DennisJaheruddin based on the matlab tags, it looks like they are trying to launch matlab with some optional command line args, the command line args they are trying to pass require quotes around the option before the value and those quotes are being stripped as they get passed through ProcessStartInfo - TaRDy

1 Answers

18
votes

Quotes in ProcessStartInfo.Arguments must be escaped as three quotes ("""). This is because a single quote is used for passing a string containing spaces as a single argument.

See the documentation here.

var psi = new ProcessStartInfo(
    "cmd_app.exe",
    "\"\"\"optional1\"\"\" optional1value \"\"\"optional2\"\"\" optional2value");
Process.Start(psi);

All cmd_app.exe does is announce its # of args and what the args are, with this input it displays:

"optional1"
optional1value
"optional2"
optional2value