Pregunta

El tema no dice mucho porque no es fácil preguntar en una línea. Tengo que ejecutar algunos programas que leo del registro. Tengo que leer de un campo donde alguien guarda todos los caminos y argumentos.
He estado usando System.Diagnostics.ProcessStartInfo configurando el nombre del programa y sus argumentos, pero he encontrado una amplia variedad de argumentos que tengo que analizar para guardar el archivo ejecutable del proceso en un campo y sus argumentos en el otro.

¿Hay alguna forma de ejecutar la cadena completa tal como está?

¿Fue útil?

Solución

He abordado esto de la misma manera que el póster anterior, usando cmd.exe con la información de inicio del proceso.

Process myProcess = New Process;
myProcess.StartInfo.FileName = "cmd.exe";
myProcess.StartInfo.Arguments = "/C " + cmd;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.StartInfo.CreateNoWindow = True;
myProcess.Start();
myProcess.WaitForExit();
myProcess.Close();

cmd / c ejecuta el comando y luego termina. WaitForExit finalizará el proceso si se ejecuta durante demasiado tiempo.

Otros consejos

Hay varios, de hecho.

  1. Puede llamar a cmd.exe con / C [su línea de comando] como argumentos. Esto hace que cmd.exe procese su comando y luego se cierre.
  2. Podría escribir el comando en un archivo por lotes y ejecutarlo.

Y, por supuesto, está el enfoque que está tomando ahora, es decir, analizar la línea de comando.

Cuando ' UseShellExecute ' es no establecido, System.Diagnostics.Process llama a CreateProcess o CreateProcessAsUser para iniciar realmente un programa (utiliza el segundo uno si especifica un usuario / dominio / contraseña). Y ambas llamadas pueden tomar el comando y el archivo como un solo argumento. Desde MSDN:

  

El parámetro lpApplicationName puede ser   NULO. En ese caso, el nombre del módulo   debe ser el primer blanco   token delimitado por el espacio en el   lpCommandLine cadena. ...

El nombre de lpApplication se asigna a ProcessStartInfo.Filename y los mapas de lpCommandLine a Arguments. Así que deberías estar listo para ir:

var processStartInfo = new ProcessStartInfo()
{
    UseShellExecute = false,
    Arguments = cmd
};
Process.Start(processStartInfo);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top