Điều này nên làm việc. Bạn có thể cố gắng loại bỏ nội dung của các luồng đầu ra và lỗi để tìm hiểu điều gì đang xảy ra:
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");
}
* BIÊN TẬP *
Đưa ra thông tin bổ sung trong bình luận của bạn dưới đây, tôi đã có thể tạo lại vấn đề. Dường như có một số cài đặt bảo mật dẫn đến hành vi này (chưa điều tra chi tiết về điều đó).
Điều này không hoạt động nếu tập tin bó không được đặt trong C:\Windows\System32
. Hãy thử di chuyển nó đến một số vị trí khác, ví dụ như vị trí thực thi của bạn. Lưu ý rằng việc giữ các tệp bó tùy chỉnh hoặc tệp thực thi trong thư mục Windows là cách thực hành tồi.
* EDIT 2 *
Nó quay ra rằng nếu các luồng được đọc đồng bộ, một bế tắc có thể xảy ra, hoặc là bằng cách đọc đồng bộ trước WaitForExit
hoặc bằng cách đọc cả hai stderr
và stdout
đồng bộ một sau khi khác.
Điều này không nên xảy ra nếu sử dụng các phương thức đọc không đồng bộ thay vào đó, như trong ví dụ sau:
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
. Nếu nó chứa các đường dẫn có khoảng trắng, bạn sẽ cần đặt dấu ngoặc kép xung quanh chúng.