¿Cómo ejecuta un programa que no sabe dónde comienzan los argumentos?
-
03-07-2019 - |
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á?
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.
- 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.
- 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);