2010-09-01 13 views
10

Necesito iniciar la ventana de comandos con algunos argumentos y ejecutar más comandos dentro.Inicie las ventanas de comandos y ejecute comandos dentro de

Por ejemplo, ejecute test.cmd y ejecute mkdir.

Puedo iniciar el test.cmd con processstartinfo, pero no estoy seguro de cómo ejecutar más comandos. ¿Puedo pasar más argumentos al proceso test.cmd?

¿Cómo puedo hacer esto?

No se han podido agregar comentarios para responder ... TANTO escribiendo aquí.

Andrea, esto es lo que estaba buscando. Sin embargo, el código anterior no funciona para mí.

Estoy lanzando un test.cmd que es un nuevo entorno de comando (como el entorno de compilación razzle) y necesito ejecutar más comandos.

psi.FileName = @"c:\test.cmd"; 
psi.Arguments = @"arg0 arg1 arg2"; 

psi.RedirectStandardInput = true; 
psi.RedirectStandardOutput = true; 
psi.CreateNoWindow = true; 
psi.UseShellExecute = false; 

Process p = new Process(); 
p.StartInfo = psi; 
p.Start(); 
p.StandardInput.WriteLine(@"dir>c:\results.txt"); 
p.StandardInput.WriteLine(@"dir>c:\results2.txt"); 
+0

yo creo que hay que dejar psi .FileName y psi.Argumentos como en mi código, y simplemente haga una p.StandardInput.WriteLine (@ "c: \ test.cmd arg0 arg1 arg2"); –

+0

Gracias, lo intenté y funcionó. Sin embargo, con esto estoy tratando de leer el registro de la consola que no devuelve el resultado que necesito. Aquí está mi código completo para aclaración. Lo que estoy esperando es la salida de command123. – user393148

+0

Proceso p = nuevo Proceso(); p.StartInfo = psi; p.Start(); p.StandardInput.WriteLine (@ "c: \ test.cmd arg1 arg2 && cd/dc: \ testdir \ sample && command123/c "); p.StandardInput.WriteLine (@" salida "); salida cadena = p.StandardOutput.ReadToEnd(); p.WaitForExit(); – user393148

Respuesta

11

Puede enviar más comandos a cmd.exe utilizando la entrada estándar del proceso. Usted tiene que redirigir, de esta manera:

var startInfo = new ProcessStartInfo 
        { 
         FileName = "cmd.exe", 
         RedirectStandardInput = true, 
         RedirectStandardOutput = true, 
         UseShellExecute = false, 
         CreateNoWindow = true 
        }; 

var process = new Process {StartInfo = startInfo}; 

process.Start(); 
process.StandardInput.WriteLine(@"dir>c:\results.txt"); 
process.StandardInput.WriteLine(@"dir>c:\results2.txt"); 
process.StandardInput.WriteLine("exit"); 

process.WaitForExit(); 

Recuerde escribir "salida" como su última orden, de lo contrario el proceso cmd no termina correctamente ...

+0

Agregué mi comentario a la sección de preguntas. – user393148

0

¿Qué estás tratando de lograr? ¿De verdad necesita abrir una ventana de comandos, o simplemente necesita hacer un directorio, por ejemplo?

mkdir es un ejecutable de Windows; puede iniciar este programa de la misma manera que inicia cmd - no es necesario iniciar primero un proceso de ventana de comando.

También podría crear un archivo por lotes que contenga todos los comandos que desea ejecutar, y luego simplemente iniciarlo utilizando las clases Process y ProcessStartInfo que ya está utilizando.

+0

Winston, mkdir fue solo un ejemplo. Estoy lanzando un nuevo entorno cmd (básicamente, que almacena un preajuste de env variables) y quiero ejecutar más comandos. La respuesta de Andrea debería resolver mi problema. Pero parece que no funciona para mí. – user393148

1

El parámetro /c a cmd.

ProcessStartInfo start = new ProcessStartInfo("cmd.exe", "/c pause"); 
Process.Start(start); 

(pause es sólo un ejemplo de lo que puede ejecutar)

Sin embargo, para la creación de un directorio que puede hacer eso y la mayoría de las otras operaciones de archivo de C# directamente

System.IO.Directory.CreateDirectory(@"c:\foo\bar"); 

Iniciar un cmd from C# es útil solo si tienes un gran archivo bat que no quieres replicar en C#.

1

Tal vez this publicación es útil. ¿Es esto lo que quieres decir?

Cuestiones relacionadas