Esto debería funcionar. Podría intentar volcar el contenido de las secuencias de salida y error para saber qué está sucediendo:
static void ExecuteCommand(string command)
{
int exitCode;
ProcessStartInfo processInfo;
Process process;
processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
// *** Redirect the output ***
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;
process = Process.Start(processInfo);
process.WaitForExit();
// *** Read the streams ***
// Warning: This approach can lead to deadlocks, see Edit #2
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
exitCode = process.ExitCode;
Console.WriteLine("output>>" + (String.IsNullOrEmpty(output) ? "(none)" : output));
Console.WriteLine("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error));
Console.WriteLine("ExitCode: " + exitCode.ToString(), "ExecuteCommand");
process.Close();
}
static void Main()
{
ExecuteCommand("echo testing");
}
* EDITAR *
Dada la información adicional en su comentario a continuación, pude recrear el problema. Parece que hay una configuración de seguridad que resulta en este comportamiento (no lo he investigado en detalle).
Esto hace el trabajo si el archivo por lotes no se encuentra en C:\Windows\System32
. Intente moverlo a otra ubicación, por ejemplo, la ubicación de su ejecutable. Tenga en cuenta que mantener archivos por lotes personalizados o ejecutables en el directorio de Windows es una mala práctica de todos modos.
* EDIT 2 *
Se resulta que si las corrientes se leen de forma sincrónica, se puede producir un callejón sin salida, ya sea mediante la lectura de forma sincronizada antes WaitForExit
o mediante la lectura de ambos stderr
ystdout
de forma sincronizada uno tras otro.
Esto no debería suceder si se utilizan métodos de lectura asíncronos, como en el siguiente ejemplo:
static void ExecuteCommand(string command)
{
var processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;
var process = Process.Start(processInfo);
process.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
Console.WriteLine("output>>" + e.Data);
process.BeginOutputReadLine();
process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
Console.WriteLine("error>>" + e.Data);
process.BeginErrorReadLine();
process.WaitForExit();
Console.WriteLine("ExitCode: {0}", process.ExitCode);
process.Close();
}
command
es. Si contiene rutas con espacios, deberá poner comillas a su alrededor.