2011-05-11 46 views
6

Es posible ejecutar comandos en C# usando algo como esto:¿Ejecuta la línea de comandos desde C# con los parámetros?

process = new Process(); 
process.StartInfo.FileName = command; 
process.Start(); 

El problema es que si la cadena de comandos contiene parámetros, por ejemplo:

C:\My Dir\MyFile.exe MyParam1 MyParam2 

Esto no funcionará y yo don' ¿Ve cómo extraer los parámetros de esta cadena y configurarla en la propiedad process.Arguments? La ruta y el nombre del archivo pueden ser otra cosa, el archivo no tiene que terminar con exe.

¿Cómo puedo solucionar esto?

+0

Entonces, la pregunta es, ¿cómo puedo dividir una línea de comandos en un '' filename' y Arguments'. – Jodrell

+0

Parece que quieres una expresión regular para encontrar el punto de ruptura. Estrictamente hablando, si el nombre del archivo contiene un espacio, debe estar entre comillas dobles. Eso te ayudaría mucho. ¿Es este el caso, en su ejemplo es el nombre de archivo 'C: \\ My' o' C: \\ My Dir \ MyFile.exe'? Por cierto, es que 'M' escapó? – Jodrell

+0

¿El archivo termina con un punto y cualquier extensión? p.ej. .com, .exe ... – ibram

Respuesta

5

Si he entendido bien que yo usaría:

string command = @"C:\My Dir\MyFile.exe"; 
string args = "MyParam1 MyParam2"; 

Process process = new Process(); 
process.StartInfo.FileName = command; 
process.StartInfo.Arguments = args; 
process.Start(); 

Si usted tiene una cadena completa que es necesario analizar Me gustaría utilizar los otros métodos presentados por los otros aquí. Si desea agregar parámetros al proceso, use lo anterior.

2

Aserción: si un nombre de archivo contiene un espacio, debe estar entre comillas dobles.

Este es ciertamente el caso en Windows. De lo contrario, las reglas se vuelven mucho más contextuales.

Tenga una mirada en regex-matching-spaces-but-not-in-strings, sospecho que puede utilizar la expresión regular,

" +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)" 

usando Regex.Split() para convertir mandas línea en una matriz. La primera parte debe ser tu nombre de archivo.

3

Esta podría ser la peor solución, pero podría uno más seguro:

string cmd = "C:\\My Dir\\MyFile.exe MyParam1 MyParam2"; 
System.IO.FileInfo fi = null; 
StringBuilder file = new StringBuilder(); 
// look up until you find an existing file 
foreach (char c in cmd) 
{ 
    file.Append(c); 
    fi = new System.IO.FileInfo(file.ToString()); 
    if (fi.Exists) break; 
} 

cmd = cmd.Remove(0, file.Length); 
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(fi.Name, cmd); 
System.Diagnostics.Process.Start(psi); 
+0

es una buena idea, utiliza el contexto de environmnet para inferir la corrección de la cadena. +1 para pensamiento lateral. También funciona si realmente no hay comillas. – Jodrell

Cuestiones relacionadas