Это должно работать. Вы можете попытаться выгрузить содержимое потоков вывода и ошибок, чтобы узнать, что происходит:
static void ExecuteCommand(string command)
{
int exitCode;
ProcessStartInfo processInfo;
Process process;
processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;
process = Process.Start(processInfo);
process.WaitForExit();
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");
}
* РЕДАКТИРОВАТЬ *
Учитывая дополнительную информацию в вашем комментарии ниже, я смог воссоздать проблему. Похоже, что есть некоторые настройки безопасности, которые приводят к такому поведению (не исследовали это подробно).
Это делает работу , если пакетный файл не находится в C:\Windows\System32
. Попробуйте переместить его в другое место, например, в место вашего исполняемого файла. Обратите внимание, что хранение пользовательских командных файлов или исполняемых файлов в каталоге Windows в любом случае является плохой практикой.
* EDIT 2 *
Это получается, что если потоки считываются синхронно, тупиковый может происходить либо путем считывания синхронно перед тем WaitForExit
или путем считывания как stderr
и stdout
синхронно друг за другом.
Этого не должно происходить, если вместо этого используются методы асинхронного чтения, как в следующем примере:
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
есть. Если он содержит пути с пробелами, вам нужно будет заключить их в кавычки.