สิ่งนี้น่าจะใช้ได้ คุณสามารถลองทิ้งเนื้อหาของเอาต์พุตและสตรีมข้อผิดพลาดเพื่อค้นหาว่าเกิดอะไรขึ้น:
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");
}
* แก้ไข *
เมื่อได้รับข้อมูลเพิ่มเติมในความคิดเห็นของคุณด้านล่างฉันสามารถสร้างปัญหาขึ้นมาใหม่ได้ ดูเหมือนว่าจะมีการตั้งค่าความปลอดภัยบางอย่างที่ส่งผลให้เกิดพฤติกรรมนี้ (ยังไม่ได้ตรวจสอบโดยละเอียด)
นี้ไม่C:\Windows\System32
ทำงานถ้าแฟ้มชุดไม่ได้อยู่ใน ลองย้ายไปยังตำแหน่งอื่นเช่นตำแหน่งที่สามารถใช้งานได้ของคุณ โปรดทราบว่าการรักษาไฟล์แบตช์ที่กำหนดเองหรือไฟล์ปฏิบัติการในไดเรกทอรี Windows นั้นเป็นวิธีปฏิบัติที่ไม่ดีอยู่ดี
* * * * * * * * แก้ไข 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
เป็นอะไร หากมีเส้นทางที่มีช่องว่างคุณจะต้องใส่เครื่องหมายคำพูดล้อมรอบ